我有一个已经排序的数组。
现在我想把所有具有子数组值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()确实:
"所有数值数组键都将被修改为从零开始计数" -php net array_unshift()
由于我需要将索引保存在$ dealStatsArray上,所以我得到的其余代码搞乱了,新的前置数组的索引应该是$ deal_id而不是0。
我该怎么做?我需要一个可以设置为数组开头前置2到3次的解决方案,就像它可以正常使用array_push(追加)我想这样做,但只是前置
更新:这是我当前的uasort函数,即在incomeY值之后对数组进行排序,以便最大数字位于数组的开头,然后降序..
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');
但是这不正确,它确实需要所有的收入Y == 0数组并在数组的开头添加,但是其余的数组都是未排序的(从最高到最低,第一个是uasort())< / p>
这是我的最终目标:要有一个数组,其中所有的收入Y == 0都在数组的开头,并且在这些数据之后,最高收入将来自然后降序在阵列末尾获得最低收入。
答案 0 :(得分:0)
您可以通过使用自定义回调“排序”数组并uasort()
;
http://www.php.net/manual/en/function.uasort.php
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'排序组合成一个回调。再次未经测试,但也许这项工作。请测试此更新示例。
答案 1 :(得分:-1)
您可以尝试合并数组而不是取消移位:
$dealStatsArray = array_merge($tmpArray, $dealStatsArray);
所以无论$tmpArray
有多少项,它们都会在开头