我的数组对于每个字段(即日期、名称等)都有一个数组。如何按日期对数组进行排序?我应该创建另一个数组吗?我可以在这里使用排序或取消排序吗?如果是,怎么办?这是我的数组:
Array
(
[date] => Array
(
[0] => 03/11/2019
[1] => 03/19/2019
[2] => 03/15/2019
[3] => 12/15/2018
)
[name] => Array
(
[0] => Lowa
[1] => Stephanie
[2] => Allan
[3] => Joffer
)
[number] => Array
(
[0] => 178989898
[1] => 111111111
[2] => 222222222
[3] => 333333333
)
[unit] => Array
(
[0] => HR
[1] => VPP
[2] =>
[3] => OAT
)
[department] => Array
(
[0] => Chemistry
[1] => IT
[2] => Lab
[3] => Contractor
)
)
最后,我的第一个元素是:
03/19/2019 Stephanie 111111111 VPP IT
我认为你的数据可以更好地组织:
$newArr = Array
(
[0] => Array
(
[date] => 03/11/2019
[name] => Lowa
[number] => 178989898
[unit] => HR
[department] => Chemistry
)
[1] => Array
(
[date] => 03/19/2019
[name] => Stephanie
[number] => 111111111
[unit] => VPP
[department] => IT
)
[2] => Array
(
[date] => 03/15/2019
[name] => Allan
[number] => 222222222
[unit] =>
[department] => Lab
)
[3] => Array
(
[date] => 12/15/2018
[name] => Joffer
[number] => 333333333
[unit] => OAT
[department] => Contractor
)
);
然后,您可以简单地按以下方式排序:
function cmp($a, $b) {
if ($a["date"] == $b["date"]) return 0;
return ($a["date"] < $b["date"]) ? -1 : 1;
}
usort($newArr, "cmp");
请注意,“月/日/年”格式的日期不能按字母顺序排序。
您绝对应该为日期使用年/月/日格式,或者编写更具体的
cmp()
函数...
更新:要回答评论中OP的问题:只需颠倒$row和'field'顺序:
for ($row = 0; $row < count($date); $row++) {
$newArr[$row]['date'] = $date[$row];
$newArr[$row]['name'] = $name[$row];
...
}
首先保存数组的键 - 然后使用
array_value
转换为整数键,以便您可以使用 ...
运算符。
然后您可以使用
array_filter
和 null
函数来重新组织数组。下一步将是使用 array_map
和 array_combine
取回钥匙。
最后一步 - 使用
usort
按“数据”排序
考虑以下示例:
$arr = ["date" => ["3", "7", "5"], "name" => ["aa", "bb", "cc"]]; // this can have a lot more sub-array inside
$keys = array_keys($arr); // extract the keys for later use
$res = array_map(null, ...array_values($arr)); // transposed the array
$res = array_map(function ($e) use ($keys) {return array_combine($keys, $e);}, $res); // return the keys to the transposed array
usort($res, function ($a, $b) {return strcmp($a['date'], $b['date']);} ); // sort all by "date"
参考:
通知 @MarcoS 关于比较日期的评论
您可以将数据保留在原始结构中,并使用
array_multisort()
按解析的日期按降序排序。 演示
$array = [
'date' => ['03/11/2019', '03/19/2019', '03/15/2019', '12/15/2018'],
'name' => ['Lowa', 'Stephanie', 'Allan', 'Joffer'],
'number' => [178989898, 111111111, 222222222, 333333333],
'unit' => ['HR', 'VPP', '', 'OAT'],
'department' => ['Chemistry', 'IT', 'Lab', 'Contractor'],
];
array_multisort(
array_map(fn($dmY) => date_create_from_format('d/m/Y', $dmY), $array['date']),
SORT_DESC,
$array['date'],
$array['name'],
$array['number'],
$array['unit'],
$array['department'],
);
var_export($array);