1

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

现在我想取所有子数组值为 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 函数,它在收入 Y 值之后对数组进行排序,以便最高数字在数组的开头,然后降序..

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())

这是我的最终目标:拥有一个数组,其中所有的收入 Y==0 都在数组的开头,在这些之后,最高收入紧随其后,然后下降到数组末尾的最低收入。

4

2 回答 2

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”排序结合到一个回调中。再次未经测试,但也许这项工作。请测试这个更新的例子。

于 2013-03-18T23:54:02.847 回答
-1

您可以尝试合并数组而不是取消移位:

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

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

于 2013-03-18T23:41:05.717 回答