【原】PHP使用引用对数组片段排序

/ 0评 / 0

不知道小伙伴有没有遇到一个这样的场景,要对一个数组的某一片段进行排序。

按照以往的思路可能会先将这个片段取出,然后对片段排序,然后想办法再把这个片段对应放回去。

最近就遇到了一个这样的问题,这里我模拟一个场景,使用PHP的引用来实现这一问题。

场景如下:

假如我有一个数组如下:

$arr = array(101,111,106,114,109,119,108);

我要对数组的前四项进行排序,后面几项暂不操作,那我该如何实现这个操作呢?

方案一:遍历数组,将前四项存到数组1中,对其排序,将后几项存到数组2中,最后讲两个数组合并到一起,新数组就是排序后的数组,我使用LeetCode的playground测试代码如下:

$arr = array(101,111,106,114,109,119,108);
$arr1 = array();
$arr2 = array();
foreach($arr as $k => $v){
    if($k < 3){
        array_push($arr1,$v);
    }else{
        array_push($arr2,$v);
    }
}
sort($arr1);
$arr = array_merge($arr1,$arr2);
print_r($arr);

然后我再尝试使用引用的方式进行排序操作。

$arr = array(101,111,106,114,109,119,108);
$arr1 = array();
//筛选出前四项
foreach($arr as $k => &$v){
    if($k <= 3){
       $arr1[$k] = &$v; 
    }
}
//排序直接影响到原数组
sort_asc($arr1);
print_r($arr);
//冒泡排序
function sort_asc($arr){
     $len = count($arr);
    for ($i = 1; $i < $len; $i++) { 
        for ($k = 0; $k < $len - $i; $k++) {
            if ($arr[$k] > $arr[$k + 1]) {
                $tmp = $arr[$k + 1];
                $arr[$k + 1] = $arr[$k];
                $arr[$k] = $tmp;
            }
        }
    }
    return $arr;
}

这里会出现一个问题,为什么用引用的时候我会选择自己写一个排序函数。那是因为在测试的是发现通过将前四项的引用取出来以后,对其进行修改的时候无法使用sort等这样的函数,否则引用将失效。

这里我引用一段php.net里对sort函数的解释:

Note: This function assigns new keys to the elements in array. It will remove any existing keys that may have been assigned, rather than just reordering the keys.

中文解释如下:

此函数为 array 中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序。

因此我猜测可能是删除原有建名后导致的引用失效。

当然如果各位小伙伴有更好的的解释,希望能邮件联系或者留言哦~~