【问题标题】:Sorting a parent multidimensional array by the values it contains in PHP根据 PHP 中包含的值对父多维数组进行排序
【发布时间】:2017-03-21 03:54:06
【问题描述】:

我正在为一个篮球队创建一个网站,我想在一个按比赛开始日期排序的表格上显示球队日程。我有一个名为 $games 的数组,其中另一个数组包含 home awaytime 的密钥对。

这是用于创建以下数组的代码。我正在通过 API 索引此信息。

$index = 0;
$games = array(); 

 for ($i = 0; $i < sizeOf($response[$index]); $i++) {  
    array_push($games, array("home" => $response[$index]['home']['name'], "away" => $response[$index]['away']['name'], "time" => $response[$index]['start_at'])); 
  }
  $index +=1;

Array
(
    [0] => Array
        (
            [home] => School1
            [away] => School2
            [time] => 2015-01-27 19:00:00
        )

    [1] => Array
        (
            [home] => School1
            [away] => School2
            [time] => 2017-02-24 19:00:00
        )

    [2] => Array
        (
            [home] => School1
            [away] => School2
            [time] => 2016-12-02 19:00:00
        )
)

我希望父索引按数组中时间的子值排序。最后我希望数组看起来像这样。

Array
(
    [1] => Array
        (
            [home] => School1
            [away] => School2
            [time] => 2017-02-24 19:00:00
        )

    [2] => Array
        (
            [home] => School1
            [away] => School2
            [time] => 2016-12-02 19:00:00
        )

    [0] => Array
        (
            [home] => School1
            [away] => School2
            [time] => 2015-01-27 19:00:00
        )
)

我查看了array_multisort() 函数,但找不到对实际父项进行排序的函数,只有数组中的键。我也看了asort(),但遇到了同样的问题。

非常感谢任何帮助!

-凯尔顿

【问题讨论】:

    标签: php arrays sorting multidimensional-array time


    【解决方案1】:

    PHP code demo

    <?php
    $game=Array
    (
        0 => Array
            (
                "home" => "School1",
               "away" => "School2",
                "time" => "2015-01-27 19:00:00"
            ),
    
        1 => Array
            (
                "home" => "School1",
                "away" => "School2",
                "time"=> "2017-02-24 19:00:00"
            ),
    
        2 => Array
            (
                "home" => "School1",
                "away" => "School2",
                "time" => "2016-12-02 19:00:00"
            )
    );
    function cmp($a, $b)
    {
        if (strtotime($a["time"]) == strtotime($b["time"])) 
        {
           return 0;
        }
        return ($a["time"] > $b["time"]) ? -1 : 1;
    }
    
    usort($game, "cmp");
    print_r($game);
    

    输出:

    Array
    (
        [0] => Array
            (
                [home] => School1
                [away] => School2
                [time] => 2017-02-24 19:00:00
            )
    
        [1] => Array
            (
                [home] => School1
                [away] => School2
                [time] => 2016-12-02 19:00:00
            )
    
        [2] => Array
            (
                [home] => School1
                [away] => School2
                [time] => 2015-01-27 19:00:00
            )
    
    )
    

    【讨论】:

      【解决方案2】:

      你想要的是usort。你会做这样的事情:

      usort($array, function($a, $b) {
         if($a['time'] < $b['time']) {
            return 1; 
         } else if ($a['time'] === $b['time']) {
            return 0; 
         }
         else {
           return -1; 
         }
      });
      

      【讨论】:

        【解决方案3】:

        此解决方案比页面上的所有其他解决方案都简单!

        虽然我假设所有这些usort() 答案都提供了正确的结果,但问题是它们都未能找到最简单的解决方案...

        如果您只是将time 元素声明为每个子数组的第一个元素,则可以避免使用“用户定义的比较函数”。使用rsort() 将是处理排序任务的最有效方式:

        设置(类似这样...)

        foreach($response[$index] as $a){    
            $games[]=['time'=>$a['start_at'],'home'=>$a['home']['name'],'away'=>$a['away']['name']];
        }
        

        这将生成一个像这样的数组:

        $game=[
            ["time"=>"2015-01-27 19:00:00","home"=>"School1","away"=>"School2"],
            ["time"=>"2017-02-24 19:00:00","home"=>"School1","away"=>"School2"],
            ["time"=>"2016-12-02 19:00:00","home"=>"School1","away"=>"School2"],
        ];
        

        那么你的无条件排序解决方案是:

        rsort($game);  // sort DESC
        

        Demo Link

        输出(使用var_export($game);):

        array (
          0 => 
          array (
            'time' => '2017-02-24 19:00:00',
            'home' => 'School1',
            'away' => 'School2',
          ),
          1 => 
          array (
            'time' => '2016-12-02 19:00:00',
            'home' => 'School1',
            'away' => 'School2',
          ),
          2 => 
          array (
            'time' => '2015-01-27 19:00:00',
            'home' => 'School1',
            'away' => 'School2',
          ),
        )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-15
          • 1970-01-01
          • 1970-01-01
          • 2011-02-24
          • 2020-07-14
          相关资源
          最近更新 更多