Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关联数组中值的保序_Php_Sorting_Associative Array - Fatal编程技术网

Php 关联数组中值的保序

Php 关联数组中值的保序,php,sorting,associative-array,Php,Sorting,Associative Array,假设我有一个数组 $array = array( 'abc' => true, 'def' => true, 'ghi' => true, 'jkl' => false ); 这是一个过于简化的示例,实际上,值是具有“活动”或“非活动”状态的对象 class myObject { var $tab_name; var $active; } 这用于为顺序很重要的选项卡视图构建选项卡数组 现在如果我切换我的一个值 $arra

假设我有一个数组

$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
);

我事先只知道要切换的值的键。

如果数组按照您的指定使用“活动”和“非活动”,您只需使用一个端口($array),它将返回所有“活动”值位于顶部,因为它是alpha排序。

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

我草草记下了这个(代码是为了清晰而不是优雅),它可能会有所帮助。它不会进行“就地”排序,但如果数据集不是太大,它可能会执行您需要的操作

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

与自定义回调一起使用,以处理您的map@MarkBaker在文档中,“如果两个成员比较相等,那么它们在排序数组中的相对顺序是未定义的。”我需要保留活动元素的顺序。因此,您还需要将实际数组传递给回调函数/闭包。。。。如果您使用的是闭包,那么使用
use
…就很容易做到这一点。。。如果您能提供一个对象数组的基本示例,那么我可以看看发布代码solution@MarkBaker我担心采用这种方法,php仍然会决定重新排序,因为回调函数只负责返回一个int,而不是执行交换。但是usort回调函数返回的值完全由开发人员控制,并且可以精确到您选择的程度。这与我想要的非常接近。但与其重建阵列,不如就地交换就足够了。该键通过
数组\u键
将名称映射到标记。谢谢:)很乐意帮忙!祝你假期愉快。:)