Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数组前加前缀,但使用PHP保留索引_Php_Arrays_Multidimensional Array - Fatal编程技术网

在数组前加前缀,但使用PHP保留索引

在数组前加前缀,但使用PHP保留索引,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个已经排序的数组 现在,我想获取所有子数组值为0的数组,并将它们放在数组的开头 这就是我试图做的: foreach($dealStatsArray as $deal_id => $dealStats) { if($dealStats['revenueY'] == 0) { $tmpArray[$deal_id] = $dealStats; // Store the arr

我有一个已经排序的数组

现在,我想获取所有子数组值为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
            }
        }
现在的问题是数组_unshift执行以下操作:

所有数字数组键将被修改为从零开始计数-php净数组_unshift

因为我需要将索引保留在$dealStatsArray上,而新的前置数组的索引应该是$deal_id,而不是0,所以我得到的代码的其余部分都被弄乱了

我该怎么做?我需要一个解决方案,它可以在数组的开头加上2到3次前缀,就像它可以很好地使用数组_push appending一样。我想这样做,但只是加上前缀

更新:这是我当前使用的uasort函数,它将数组排序在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数组,并在数组的开头进行预结束,但随后其余数组将从最高到最低排序,即第一个uasort


这是我的最终目标:创建一个所有revenueY==0都位于数组开头的数组,之后是最高收入,然后在数组末尾下降到最低收入。

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

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

因此,无论$tmpArray将有多少项,它们都将在开始时出现

您可能可以通过使用自定义回调和uasort对数组进行“排序”来实现这一点

尚未能够测试它,“回调”方法可能需要一些调整,但是,uasort允许您使用自定义的“回调”方法对数组进行排序,该方法确定数组的“排序方式”。数组中的值将被排序,而不会丢失键/值关系

我的示例只是为了说明如何实现这一点,但是,正如前面提到的,可能需要进行调整

[更新]
我已经通过示例进行了更新,尝试将“常规”排序和“0”排序合并到单个回调中。再次未经测试,但可能这是工作。请测试此更新的示例。

请给出一个或两个现有数组、新元素索引和预期输出的示例。您认为这是如何工作的?如果我有一个像这样的数组0=>'a',1=>'b',你的前置词会做什么?是否覆盖0处的值?在-1处插入一些东西?@ITroubs在PHP中的“关联”数组可以排序,同时保持它们的键/值关系。也就是说,数组2=>'c',1=>'b',0=>'a'应该是possible@ITroubsOP的原始代码将无法工作,但使用uasort可能会使之成为可能,我想即使使用数字键,也会真正弄乱键!查看文档,尤其是示例!如果键是数字的,那么它们将被移动。谢谢你的回答。当然,这是可行的,但问题是,正如前面提到的,我有一个已经排序的数组,它也使用uasort和自定义回调进行了排序,当我执行第二个uasort时,它会使用revenueY==0对数组进行预处理,但是剩下的就不排序了?我的第一个排序是对整个数组进行排序,这样最高的收入就在顶部,然后下降。但除此之外,我希望所有收入为0的人都能名列前茅。我不知道是否可以使用一个回调函数来进行单个uasort,该函数可以通过此函数处理和排序?我已尝试修改我的回调方法,将“常规”排序和“0”值上的排序结合起来。不知道它是否有效-1和1应该在'revenueY==0'部分中反转
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);