我一切就绪,没有错误,一切看起来都是正确的。我尝试按升序输出名称和日期,同时使用 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 (
[Date] => Array (
[0] => 7 October 2015
[1] => 14 October 2014
[2] => 12 October 2016
)
[Name] => Array (
[0] => Jane Doe
[1] => Nash Patel
[2] => Joe Public
)
)
我已阅读文档,看来
array_multisort($sort_name, SORT_ASC, $sort_date, SORT_ASC, $win);
意味着 $win 将按名称和日期排序,但按名称排序比日期具有更高的优先级。
尝试添加更多具有不同日期的
Jane Doe
,以查看它们是否按日期排序。
因为你说数组不需要一起排序,这里是如何拆分它们并分别排序。
$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);
}
输出:
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 "
}
使用多重排序时,所有数组参数必须包含相同的元素计数。您不需要附加
$win
作为最后一个参数来影响之前声明的元素。
将参数传递给函数时,任何可以通过引用修改的数组都将发生变化。直接从函数返回派生的任何参数都不会受到影响(并且无论如何都无法检索)。
由于日期格式不是“大端”,因此需要将其转换为一组可以简单排序的值。对每个值调用
strtotime()
将适当地生成 unix 时间戳整数。
代码:(演示)
array_multisort(
$win['Name'],
array_map('strtotime', $win['Date']),
$win['Date']
);
var_export($win);