通过排序将数组元素移动到数组的末尾


Moving array elements to end of array by sorting

如果我有一个这样的数组(它可以是任何数字的组合):

$arr = array(1, 2, 4, 2, 3, 5, 4, 2, 1);

我想将所有等于4的元素移动到数组的末尾,同时保留其他元素的顺序,所以理想情况下,我得到的数组是:

1, 2, 2, 3, 5, 2, 1, 4, 4

我想我可以通过使用一个排序函数来实现这一点:

uasort($arr, function($a, $b){
    return $b == 4 ? -1 : 1;
});

它将"4"个元素移动到最后,但破坏了其他元素的顺序,这是我使用上述代码的结果:

2, 3, 1, 2, 5, 2, 1, 4, 4

我的排序处理程序函数应该是什么样子?/有没有比对数组进行排序更好的方法来实现这一点?

注释;我想保留我的数组密钥(因此是uasort

中的eval.

这应该适用于您:

<?php
    $arr = array(1, 2, 4, 2, 3, 5, 4, 2, 1);
    foreach($arr as $k => $v) {
        if($v == 4) {
            unset($arr[$k]);
            $arr[$k] = $v;  
        }
    }
    print_r($arr);
?>

输出:

//before 
Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 2 [4] => 3 [5] => 5 [6] => 4 [7] => 2 [8] => 1 ) 
//after                    ^ key ^  value                      ^ key ^ value  
Array ( [0] => 1 [1] => 2 [3] => 2 [4] => 3 [5] => 5 [7] => 2 [8] => 1 [2] => 4 [6] => 4 )
                                                                      //^     ^  ^     ^

以下是使用uasort:的一种方法

$arr = array(1, 2, 4, 2, 3, 5, 4, 2, 1);
uasort($arr, function($a, $b){
    if ($a == 4) return -1;
    if ($b == 4) return 1;
    return 0;
});
$arr = array_reverse($arr, true);
print_r($arr);

array_reversetrue参数保留数组中的键。return 0是可选的,但在我看来可以提高清晰度。

输出:

Array
(
    [0] => 1
    [3] => 2
    [1] => 2
    [4] => 3
    [5] => 5
    [7] => 2
    [8] => 1
    [2] => 4
    [6] => 4
)

与相同值相对应的一些键混淆是不可避免的。

这个…怎么样。。。??

<?php
$arr = array(1, 2, 4, 2, 3, 5, 4, 2, 1);
$temp= array();
foreach($arr as $index => $value){
  if($value == 4) {
    array_push($temp, $value);    
    unset ($arr[$index]);
  }
}
$result = array_merge($arr, $temp);
var_dump($result);

给我这个:

array(9) {[0]=>int(1) [1]=>int(2) [2]=>int(2) [3]=>int(3) [4]=>int(5) [5]=>int(2) [6]=>int(1) [7]=>int(4)   [8]=>int(4) }

尝试。。。

  1. count(array_keys())
  2. array_diff()
  3. array_values()
  4. array_fill()
  5. array_merge()

示例:https://eval.in/295552

代码

<?php
// initial array
$arr = array(1, 2, 4, 2, 3, 5, 4, 2, 1);
// key to move (as a new array for array_diff)
$key_removed = array(4);
// count the number of repetitions (for array_fill)
$key_repetitions = count(array_keys($arr, $key_removed[0], true));
// new temp_array without the removed key
$temp_arr1 = array_diff($arr, $key_removed);
// reorder array index
$temp_arr1 = array_values($temp_arr1);
// add to temp_array the removed key `key_repetitions` number of times
$temp_arr2 = array_fill(count($temp_arr1) + 1, $key_repetitions, $key_removed[0]);
// merge both
$arr = array_merge($temp_arr1, $temp_arr2);
var_dump($arr);