我有一个数组数组,比如
$statuses = array(
[0] => array('id'=>10, 'status' => 'active'),
[1] => array('id'=>11, 'status' => 'closed'),
[2] => array('id'=>12, 'status' => 'active'),
[3] => array('id'=>13, 'status' => 'stopped'),
)
我希望能够制作一个新的数组,并且每个子数组都将包含基于它们是否具有相同状态的元素。这里的诀窍是,我不想根据硬编码的状态名称进行案例检查,因为它们可能是随机的。我想基本上做一个动态比较,然后说"如果你是唯一的,那么创建一个新的数组并把自己放在那里,如果一个数组已经存在,并且状态相同,那么就把我放在那里"。样本结果可能看起来像这样。
我真的遇到了一个挑战,因为我唯一能想到的方法就是将每个元素与其他元素进行比较,如果是唯一的,就创建一个新的数组。如果原始数组大于100,则会很快失控。必须有一些内置的功能可以使其高效。
<?php
$sortedArray = array(
['active'] => array(
array(
'id' => 10,
'status' => 'active'
),
array(
'id' => 12,
'status' => 'active'
)
),
['closed'] => array(
array(
'id' => 11,
'status' => 'active'
)
),
['stopped'] => array(
array(
'id' => 13,
'status' => 'active'
)
),
)
$SortedArray = array();
$SortedArray['active'] = array();
$SortedArray['closed'] = array();
$SortedArray['stopped'] = array();
foreach($statuses as $Curr) {
if ($Curr['status'] == 'active') { $SortedArray['active'][] = $Curr; }
if ($Curr['status'] == 'closed') { $SortedArray['closed'][] = $Curr; }
if ($Curr['status'] == 'stopped') { $SortedArray['stopped'][] = $Curr; }
}
你也可以用函数的方式来做这件事,尽管它和Marc说的很一样。
$sorted = array_reduce($statuses, function($carry, $status) {
$carry[$status['status']][] = $status;
return $carry;
}, []);