我试图用额外的标志对多维数组进行排序。该数组使用名称和可选的已检查标记获取子项。我想通过选中,然后名称对此数组进行排序。我在名称部分工作正常,但我似乎无法在其中获得检查标记。
<?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
任何帮助都将不胜感激。
答案 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
)
)