保留关联数组中值的顺序


Preserving order of values in associative array

假设我有一个这样的数组

$array = array(
    'abc' => true,
    'def' => true,
    'ghi' => true,
    'jkl' => false
);

这是一个过于简化的示例,实际上这些值是状态为"活动"或"非活动"的对象。

class myObject {
    var $tab_name;
    var $active;
}

这用于为顺序很重要的选项卡视图构建选项卡数组。

现在,如果我切换我的一个值

$array['abc'] = false;
$array['jkl'] = true;

如何对数组(实际上是有序映射)重新排序,以便true值保持在前面,保留它们的顺序(应附加任何添加),false值保留在后面(顺序不重要)?

即。我希望输出为:

array (
    'def' => true,
    'ghi' => true,
    'jkl' => true,
    'abc' => false
);

我事先知道的只是值被切换的关键。

似乎没有任何内置的数组排序函数允许您同时访问键和值,这似乎是您在这里需要的,因为幕后的排序算法看起来并不稳定。

我把它划掉了(编码是为了清晰而不是优雅),它可能会有所帮助。它不执行"就地"排序,但如果数据集不是太大,它可能会执行您需要的操作。

function group_array($ary){
    $t = array();
    $f = array();
    $res = array();
    foreach (array_keys($ary) as $k){ //Assuming that you're 100% sure that the input array keys are already ordered
        if ($ary[$k] == 'true') {
            $t[] = $k;
        } else if ($ary[$k] == 'false') {
            $f[] = $k;
        }
    }
    foreach ($t as $true_key){
        $res[$true_key] = 'true';
    }
    foreach ($f as $false_key){
        $res[$false_key] = 'false';
    }
    return $res;
}

如果数组使用您指定的"活动"和"非活动",则可以只使用 asort($array),它将在顶部返回所有"活动"值,因为它是 alpha 排序。