我有一个带字符串索引的数组,我需要对其进行部分排序。也就是说,必须首先移动一些元素,但其他元素应保持其当前(PHP内部)顺序不变:
# The element with key "c" should be first
$foo = array(
"a" => 1,
"b" => 2,
"c" => 3,
"d" => 4,
);
uksort($foo, function ($a, $b) {
if ($a === "c") {
return -1;
} elseif ($b === "c") {
return 1;
}
return 0;
});
var_dump($foo);
我的期望:
array(4) { ["c"]=> int(3) ["a"]=> int(1) ["b"]=> int(2) ["d"]=> int(4) }
//--------------------------^ "a" remains first of the unsorted ones
我得到了什么:
array(4) { ["c"]=> int(3) ["d"]=> int(4) ["b"]=> int(2) ["a"]=> int(1) }
//--------------------------^ "d" moved above "a"
这似乎是由于排序算法uksort()
在内部使用,它破坏了元素的脆弱顺序。有没有其他方法可以实现这种排序?
答案 0 :(得分:1)
使用any sort
函数对于此任务来说太过分了。您只需要将输入数组合并到一个单独的数组中,该数组包含应该首先出现的元素。数组联合运算符 (+
) 可以很好地处理关联数组(否则 array_merge()
可以)。
代码:(Demos)
如果保证键 c 存在:
$foo = array(
"a" => 1,
"b" => 2,
"c" => 3,
"d" => 4,
);
$foo = ['c' => $foo['c']] + $foo;
var_export($foo);
如果密钥 c 可能不存在,请先检查它:
$bar = array(
"a" => 1,
"b" => 2,
"d" => 4,
);
if (array_key_exists('c', $bar)) {
$bar = ['c' => $bar['c']] + $bar;
}
var_export($bar);
输出:
array (
'c' => 3,
'a' => 1,
'b' => 2,
'd' => 4,
)
和
array (
'a' => 1,
'b' => 2,
'd' => 4,
)
答案 1 :(得分:0)
这对我有用并返回:
array(4) { ["c"]=> int(3) ["a"]=> int(1) ["b"]=> int(2) ["d"]=> int(4) }
<?php
# The element with key "c" should be first
$foo = array(
"a" => 1,
"b" => 2,
"c" => 3,
"d" => 4,
);
uksort($foo, function ($a, $b) {
if ($a === "c") {
return -1;
} else
return 1;
});
var_dump($foo);
?>