保持关联数组中的值顺序

时间:2013-12-18 17:22:44

标签: php sorting 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值保留在后方(顺序不重要)?

IE。我希望输出为:

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

事先我所知道的是切换价值的关键。

2 个答案:

答案 0 :(得分:2)

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

我抓了这个(为了清晰而不是优雅而编码),它可能有所帮助。它没有“就地”排序,但如果数据集不是太大,它可能会做你需要的。

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;
}

答案 1 :(得分:0)

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