如果我有一个这样的数组(它可以是任何数字的组合):
$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_reverse
的true
参数保留数组中的键。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) }
尝试。。。
- count(array_keys())
- array_diff()
- array_values()
- array_fill()
- 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);