Intereting Posts
Как отображать последние комментарии от Facebook Комментарии социальный плагин? Закрытие вызова, присвоенное объекту напрямую Как я должен служить изображению с Laravel? Symfony2: Получение маршрута в Слушателе загрузки страницы Загрузка библиотек c из php Выберите два последовательных слова регулярным выражением PHP: получить ключ из массива в цикле foreach Безопасная связь между скриптом Flash и PHP Ошибка PHP: вызов функции-члена rowCount () для объекта без объекта Как отсортировать массив римских цифр? Отправить письмо с шаблоном, используя php Как запросить встроенные документы ссылочным документом? PHP: Как преобразовать регулярное выражение в пример соответствия? Создайте механизм для передачи положительного целого числа и отобразите все значения серии Фибоначчи до и включите указанное значение Дата PHP – введите имя месяца на местном языке

Как отобразить список лет, упорядоченный по столетию

У меня есть целый ряд лет:

[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
         )

 )

И здесь вы можете увидеть результат:

  • 1200
    • 1258
  • 1500
  • 1900
    • 1923
    • 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 .