带有额外标志的多维数组排序

时间:2017-01-05 17:24:45

标签: php arrays sorting multidimensional-array

我试图用额外的标志对多维数组进行排序。该数组使用名称和可选的已检查标记获取子项。我想通过选中,然后名称对此数组进行排序。我在名称部分工作正常,但我似乎无法在其中获得检查标记。

<?php

$data = array(
    array(
        'name' => 'C'
    ),
    array(
        'name' => 'A'
    ),
    array(
        'name' => 'E',
        'checked' => true
    ),
    array(
        'name' => 'B',
        'checked' => true
    ),
    array(
        'name' => 'F'
    ),
    array(
        'name' => 'D'
    )
);

usort($data, function($a, $b) {
    return strcmp($a['name'], $b['name']);
});

记录:我想要这样的结果: 乙 Ë 一个 C d ˚F

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

usort内,您可以&#34;优先排序&#34;已检查的标志:

usort($data, function($a, $b) {

    $diff = strcmp($a['name'], $b['name']);

    if (isset($a['checked']) && isset($b['checked'])) return $diff;
    if (isset($a['checked'])) return -1;
    if (isset($b['checked'])) return 1;
    return $diff;
});

如果您添加了'checked' => false属性,则必须相应地更改逻辑。

答案 1 :(得分:0)

将数组拆分为两部分(已检查但未选中),单独排序,并合并结果:

function filterAndSort($array, $checked = true) {
    $array = array_filter($array, function ($a) use ($checked) {
        return $checked ? isset($a['checked']) : !isset($a['checked']);
    });
    usort($array, function($a, $b) {
        return strcmp($a['name'], $b['name']);
    });
    return $array;
}

$data = array_merge(filterAndSort($data, true), filterAndSort($data, false));

print_r($data);

输出:

Array(
    [0] => Array(
        [name] => B
        [checked] => 1
    )
    [1] => Array(
        [name] => E
        [checked] => 1
    )
    [2] => Array(
        [name] => A
    )
    [3] => Array(
        [name] => C
    )
    [4] => Array(
        [name] => D
    )
    [5] => Array(
        [name] => F
    )
)