PHP 对多维数组进行排序

问题描述 投票:0回答:3

我是 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);

输出\

Array ( [日期] => Array ( [0] => 2015 年 10 月 7 日 [1] => 2014 年 10 月 14 日 [2] => 2016 年 10 月 12 日 ) [名称] => Array ( [0] => Jane Doe [ 1] => 纳什·帕特尔 [2] => 乔·公众 ) )

php multidimensional-array
3个回答
1
投票

我已阅读文档,看来

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

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

尝试添加更多具有不同日期的

Jane Doe
,以查看它们是否按日期排序。


0
投票

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

$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 "
}

0
投票

使用多重排序时,所有数组参数必须包含相同的元素计数。您不需要附加

$win
作为最后一个参数来影响之前声明的元素。

将参数传递给函数时,任何可以通过引用修改的数组都将发生变化。直接从函数返回派生的任何参数都不会受到影响(并且无论如何都无法检索)。

由于日期格式不是“大端”,因此需要将其转换为一组可以简单排序的值。对每个值调用

strtotime()
将适当地生成 unix 时间戳整数。

代码:(演示

array_multisort(
    $win['Name'],
    array_map('strtotime', $win['Date']),
    $win['Date']
);
var_export($win);
© www.soinside.com 2019 - 2024. All rights reserved.