1

我有一个带有字符串索引的数组,我需要对其进行部分排序。也就是说,必须先移动一些元素,但其他元素应保持当前(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()内部使用的排序算法破坏了元素的脆弱顺序。有没有其他方法可以实现这种排序?

4

2 回答 2

1

对于此任务,使用任何 sort功能都是大材小用。您只需要将输入数组合并到一个包含应该首先出现的元素的单独数组中。数组联合运算符 ( +) 将很好地用于您的关联数组(否则array_merge()会这样做)。

代码:(演示

如果密钥 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,
)
于 2021-02-26T15:04:32.947 回答
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);

?>
于 2013-04-30T19:20:01.657 回答