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

时间:2015-03-03 15:14:06

标签: php arrays 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.in

4 个答案:

答案 0 :(得分:4)

这应该适合你:

<?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 )
                                                                      //^     ^  ^     ^

答案 1 :(得分:3)

以下是使用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);

true的{​​{1}}参数保留了数组中的键。 array_reverse是可选的,但在我看来提高了清晰度。

输出:

return 0

对应于相同值的某些键被混淆的事实是不可避免的。

答案 2 :(得分:1)

试试......

  1. 计数(array_keys())
  2. array_diff()
  3. array_values()
  4. array_fill()
  5. array_merge()
  6. 示例:https://eval.in/295552

    CODE

    <?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);
    

答案 3 :(得分:1)

这个怎么样...... ??

<?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) }