У меня есть целый ряд лет:
[1500, 1946, 1923, 1258]
и я бы хотел отобразить их, заказанные по столетию (с указанием соответствующего века) следующим образом:
<ul> <li>1200 <ul> <li>1258</li> </ul> </li> <li>1500</li> <li>1900 <ul> <li>1923</li> <li>1946</li> </ul> </li> </ul>
Обратите внимание, что годами того же века являются дети одного и того же века. Кроме того, если один из лет совпадает с самим веком, я только хочу отобразить родителя il
.
Моя идея заключалась в том, чтобы использовать диапазон, но как я могу проверить, больше или меньше значения текущего диапазона и правильно li
встраивать ul
или li
зависимости от года? – Даже не уверен, что это правильный подход, это ниже не полностью работает, но это идея:
<ul> <?php $value_1 = "1942"; $value_2 = "1230"; foreach (range(0, 3000, 1000) as $number) { echo $value; if ($value < $number) { ?> <li> <?php echo $value... ?> </li> <?php } ?> <?php } ?> </ul>
Я скажу это словами:
У меня есть cms, где пользователь может выбрать год, может быть 1942 или 1230. Теперь я получаю эти годы в передней части, и я хотел бы построить динамическую навигацию из них в соответствии с html выше
Здесь у вас есть другой способ сделать это. Это работает также, если в том же веке существует более одного года.
<?php $yearsArray = [1500, 1946, 1923, 1258]; $centuryHash = []; $yearsArray = array_unique($yearsArray); sort($yearsArray); foreach ($yearsArray as $year) { $currentCentury = floor($year/100)*100; if(!$centuryHash[$currentCentury]){ $centuryHash[$currentCentury] = []; } if($currentCentury != $year){ $centuryHash[$currentCentury][] = $year; } } //echo "<pre>" . print_r($centuryHash,1) . "</pre>"; echo "<ul>"; foreach ($centuryHash as $century => $centuryYears) { echo "<li>" . $century; if($centuryYears){ echo "<ul>"; foreach ($centuryYears as $year) { echo "<li>$year</li>"; } echo "</ul>"; } echo "</li>"; } echo "</ul>";
Здесь вы можете увидеть содержимое $centuryHash
:
массив ( [1200] => Массив ( [0] => 1258 ) [1500] => Массив ( ) [1900] => Массив ( [0] => 1923 [1] => 1946 ) )
И здесь вы можете увидеть результат:
Вам нужно округлить год до ближайшего столетия, чтобы соответствовать тому, к какому году принадлежит столетие. Я добавил динамическое max century, если вы хотите отсортировать массив из min-max year, просто добавьте это.
См. Его подробное описание в 3v4l или посмотрите, как он работает, как показано ниже, на 3v4l .
$years = ['3333', 3689, '3000']; // can be type string or int $nav = []; foreach($years as $year) { foreach(range(0, round(max($years), -3), 1000) as $century) { if(floor((int)$year/1000) * 1000 == $century) { $nav{$century}[] = (int)$year; } } }
Выход: [3000]=> array(3) { [0]=> int(3333) [1]=> int(3689) [2]=> int(3000) }
Этот код довольно процедурный, вы можете отремонтировать его и создать класс. Что-то вроде этого:
class Year { const PLAIN = 1; const ARRAY = 2; private $_years = []; public function append($year, $type) { if($type & self::PLAIN && !is_array($year)) { $this->_years[] = $year; return $this; } else if($type & self::ARRAY && is_array($year)) { $this->_years = $year; return $this; } else { throw new Exception('Unknown type.'); } } public function fetch() { return $this->_years; } } class CenturyConversion { public static function parse(Year $years) { $nav = []; foreach($years->fetch() as $year) { foreach(range(0, round(max($years->fetch()), -3), 1000) as $century) { if(floor((int)$year/1000) * 1000 == $century) { $nav{$century}[] = (int)$year; } } } return $nav; } }
Который может использоваться двумя способами: с массивом или с одним годом. Методы поддерживают тип int и строку типа. Вот как добавить годы вручную:
CenturyConversion::parse((new Year)->append(1992, Year::PLAIN)->append('1365', Year::PLAIN));
Вот как добавить годы в массив:
CenturyConversion::parse((new Year)->append([1992, 1365, '2010'], Year::ARRAY));
Краткое описание кода синтаксического анализа:
Во-первых, мы принимаем числовые данные за годы и находим максимальное значение внутри массива. Затем мы округляем максимальное значение до ближайших тысяч, поэтому мы знаем, где остановить проверку и с чего начать. Затем мы каждый год проверяем свой век, мы делаем это, проверяя годы ближайшего века, округляя его до ближайшей тысячи.
См. Код стиля OO, работающий на 3v4l .