前置于数组,但使用PHP保留索引

时间:2013-03-18 23:35:51

标签: php arrays multidimensional-array

我有一个已经排序的数组。

现在我想把所有具有子数组值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都在数组的开头,并且在这些数据之后,最高收入将来自然后降序在阵列末尾获得最低收入。

2 个答案:

答案 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有多少项,它们都会在开头