如何显示按世纪排序的年份列表

时间:2016-11-19 17:13:56

标签: 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世纪项目的孩子。此外,如果其中一年与本世纪匹配,我只想显示父il

我的想法是使用范围,但如何检查值是否大于或小于当前范围,嵌套 a ulli正确基于那一年? - 甚至不确定它是否是正确的方法,下面的内容并不完全正常,但这是一个想法:

<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建立一个动态导航

2 个答案:

答案 0 :(得分:1)

在这里你有另一种方法可以做到这一点。如果在同一世纪有超过一年的时间,这也有效。

<?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的内容:

Array
(
    [1200] => Array
        (
            [0] => 1258
        )

    [1500] => Array
        (
        )

    [1900] => Array
        (
            [0] => 1923
            [1] => 1946
        )

)

在这里你可以看到结果:

  • 1200
    • 1258
  • 1500
  • 1900
    • 1923
    • < LI> 1946

答案 1 :(得分:0)

您需要将年份舍入到最近的世纪才能匹配哪一年属于哪个世纪。我添加了一个动态的最大世纪,如果你想从最小 - 最大年份对数组进行排序,只需添加它。

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类型和string类型。这是手动添加年份的方法:

CenturyConversion::parse((new Year)->append(1992, Year::PLAIN)->append('1365', Year::PLAIN));

这是在数组中添加年份的方法:

CenturyConversion::parse((new Year)->append([1992, 1365, '2010'], Year::ARRAY));

解析代码摘要:

首先,我们获取年份的数字输入并找到数组内的最大值。然后我们将最大值舍入到最接近的千位,以便我们知道在哪里停止检查以及从哪里开始。然后我们通过每年检查它的世纪,我们这样做是通过将向下四舍五入到最接近的千位来检查最接近世纪的年份。

查看在3v4l工作的OO样式代码。