如果我有这样的数组(它可以是数字的任意组合):
$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
)
答案 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)
试试......
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) }