【问题标题】:PHP Sorting An Multidimensional ArrayPHP对多维数组进行排序
【发布时间】:2017-08-14 14:33:47
【问题描述】:

我是 PHP 新手,我不确定为什么我的代码没有输出。我已经准备好了一切,没有错误,一切似乎都是正确的。我试图在使用 print_r() 验证顺序时按升序输出名称和日期。我不知道我哪里出错了,我希望能得到一些指导。

$win = array('Name'=> 
                        array('Jane Doe ', 'Nash Patel ', 'Joe Public '), 
             'Date'=>
                        array('7 October 2015 ', '14 October 2014 ', '12 October 2016 '));

foreach($win as $element => $namedate) {
    echo '<strong>' . $element . '</strong><br>';
    foreach($namedate as $both) {
       echo $both . '<br/>';
    }
}

foreach($win as $c=>$key) {
        $sort_date[] = $key['Date'];
        $sort_name[] = $key['Name'];
    }

    array_multisort($sort_name, SORT_ASC, $sort_date, SORT_ASC, $win);
    print_r($win);

输出\

数组([日期] => 数组([0] => 2015 年 10 月 7 日 [1] => 2014 年 10 月 14 日 [2] => 2016 年 10 月 12 日)[名称] => 数组([0] => 简Doe [1] => Nash Patel [2] => Joe Public ) )

【问题讨论】:

  • 您确定它不能按原样工作吗?它似乎对我有用?
  • @DrRoach 当我输出此代码时,它会准确显示我输入的内容,但它不会按升序输出日期,即 2015 年在 2014 年之前输出
  • 日期没有排序吗?还是它们的排序方向错误?
  • @DrRoach 我已将我的输出添加到帖子中,以便您自己查看。它根本没有按外观排序。

标签: php multidimensional-array


【解决方案1】:

我已经阅读了文档,似乎

array_multisort($sort_name, SORT_ASC, $sort_date, SORT_ASC, $win);

表示 $win 将按名称和日期排序,但按名称排序比日期具有更高的优先级。

尝试添加更多具有不同日期的Jane Doe,以查看它们是否按日期排序。

【讨论】:

  • 单独对日期和姓名进行排序,然后分别打印会更容易吗?
  • 这取决于您要完成的工作,日期是否与姓名相关(例如日期是姓名的人的加入日期)还是完全不同的数据?如果数据不相关,并且您只需要对两组进行排序,那么可以,只需分别对它们进行排序。
  • 它们应该是联合的,但它们可以单独排序。
  • 嗯 - 那么你回答了你的问题。如果您确定可以单独排序 - 单独排序。
  • @meta 同意,那么一下子就没有问题了。
【解决方案2】:

因为你说数组不需要一起排序这里是如何拆分它们并单独排序。

$win = array('Name'=> 
                    array('Jane Doe ', 'Nash Patel ', 'Joe Public '), 
         'Date'=>
                    array('7 October 2015 ', '14 October 2014 ', '12 October 2016 '));


$dates = $win["Date"]; //split array
$names = $win["Name"]; //split array

usort($dates, "date_sort"); // custom sort on dates
asort($names); // sort names

var_dump($dates);
Var_dump($names);


function date_sort($a, $b) {
    return strtotime($a) - strtotime($b);
}

https://3v4l.org/kLjRh

输出:

array(3) {
  [0]=>
  string(16) "14 October 2014 "
  [1]=>
  string(15) "7 October 2015 "
  [2]=>
  string(16) "12 October 2016 "
}

 array(3) {
  [0]=>
  string(9) "Jane Doe "
  [2]=>
  string(11) "Joe Public "
  [1]=>
  string(11) "Nash Patel "
}

【讨论】:

  • 我编辑了删除 '1)' 的代码,因为这些只是为了演示而我忘记在帖子中删除它们
  • 名称的输出也是错误的,因为“Nash Patel”不是按升序排列的。 J 在 N 之前。
  • @madoreo 所以这不是您想要排序的日期顺序?
  • 是的,我想按日期顺序和姓名顺序升序排列。
  • 但是你不能同时排序。如果这样做,键之间的关系将是错误的。其中之一必须不符合您希望向后保持某种可跟踪性的顺序。
猜你喜欢
  • 2016-09-27
  • 1970-01-01
  • 2012-06-15
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多