我有一个已经排序好的数组。
现在我想取所有子数组值为0的数组并将它们放在数组的开头。
这就是我想做的:
foreach($dealStatsArray as $deal_id => $dealStats)
{
if($dealStats['revenueY'] == 0)
{
$tmpArray[$deal_id] = $dealStats; // Store the array
unset($dealStatsArray[$deal_id]); // Unset the current one, since it is not in right position
array_unshift($dealStatsArray, $tmpArray); // Prepend the tmp array, to have it at the beginning of the array
}
}
现在的问题是array_unshift()做:
"所有数值数组键将被修改为从0开始计数" -php net array_unshift()
这打乱了我得到的其余代码,因为我需要保持索引在$dealStatsArray上,新的前置数组的索引应该是$deal_id而不是0。
我该怎么做?我需要一种解决方案能够在数组的开头加上2到3次前缀,就像使用array_push(追加)一样我想这样做,但只是在
前面加上Update:这是我当前的sort函数,即在revenueY值之后对数组进行排序,以便最高的数字位于数组的开始,然后降序。
function cmp($a, $b)
{
if (($a["revenueY"]) == ($b["revenueY"])) {
return 0;
}
return (($a["revenueY"]) > ($b["revenueY"])) ? -1 : 1;
}
uasort($dealStatsArray, "cmp");
现在如果我遵循@thaJeztah的答案,这部分有效,然后我在下面添加了这个:
function sortbyRevenueY($a, $b) {
if ($a['revenueY'] == $b['revenueY']) {
return 0;
}
return ($a['revenueY'] == 0) ? -1 : 1;
}
uasort($dealStatsArray, 'sortbyRevenueY');
但这不能正确工作,它确实取了所有的revenueY==0数组并在数组的开头加上前缀,但随后其余的数组被无序排序(从高到低,第一个是unasort ())
这是我的最终目标:拥有一个数组,其中所有的revenueY==0都在数组的开始,在这些之后,最高的收入在数组之后,然后下降到最低的收入在数组的末尾。
您可以通过使用自定义回调和uasort()
对数组进行'排序'来实现这一点;
function sortbyRevenueY($a, $b) {
if ($a['revenueY'] == $b['revenueY']) {
return 0;
}
if (0 == $a['revenueY']) {
return -1;
}
if (0 == $b['revenueY']) {
return 1;
}
return (($a["revenueY"]) > ($b["revenueY"])) ? -1 : 1;
}
uasort($dealStatsArray, 'sortbyRevenueY');
print_r($dealStatsArray);
还没有能够测试它和'回调'方法可能需要一些调整,然而,uasort()
允许您使用自定义'回调'方法来排序数组,该方法决定数组应该如何排序。数组中的值将被排序,且不丢失键值关系。
我的例子只是为了说明如何实现这一点,但是,如前所述,可能需要调整。
(更新)我已经更新了示例,试图将"常规"排序和按"0"排序结合到一个回调中。这也是未经测试的,但也许可行。
您可以尝试合并数组而不是不移动:
$dealStatsArray = array_merge($tmpArray, $dealStatsArray);
所以无论$tmpArray
有多少项,它们都会在开头