前置到数组,但保留索引与PHP


Prepend to array, but keep the indexes with PHP

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

现在我想取所有子数组值为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()对数组进行'排序'来实现这一点;

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"排序结合到一个回调中。这也是未经测试的,但也许可行。

您可以尝试合并数组而不是不移动:

$dealStatsArray = array_merge($tmpArray, $dealStatsArray);

所以无论$tmpArray有多少项,它们都会在开头