我的多维数组按
OwnerNickName
字段按字母顺序排序,但我需要将 OwnerNickName = 'My House'
行作为粘性第一行,然后按 OwnerNickname 升序排序其他所有内容。
输入:
[
'0318B69D-5DEB-11DF-9D7E-0026B9481364' => [
'OwnerNickName' => 'andy',
'Rooms' => [ /* irrelevant */ ]
],
'286C29DE-A9BE-102D-9C16-00163EEDFCFC' => [
'OwnerNickName' => 'anton',
'Rooms' => [ /* irrelevant */ ]
],
'8BE18F84-AC22-102D-9C16-00163EEDFCFC' => [
'OwnerNickName' => 'mike',
'Rooms' => [ /* irrelevant */ ]
],
'29B455DE-A9BC-102D-9C16-00163EEDFCFC' => [
'OwnerNickName' => 'My House',
'Rooms' => [ /* irrelevant */ ]
]
]
您可能想实现自己的排序功能,例如:
function cmp($a, $b)
{
if ($a['OwnerNickName'] == $b['OwnerNickName']) {
return 0;
}
if ($a['OwnerNickName'] == 'My House') {
return -1;
} else if ($b['OwnerNickName'] == 'My House') {
return 1;
}
return ($a['OwnerNickName'] < $b['OwnerNickName']) ? -1 : 1;
}
usort($array, 'cmp');
如果您想改变对哪个索引排序或哪个值应该特殊的想法,这样的事情可能适合:
function specialSort(array &$array, $index, $specialvalue){
$callback = function($a,$b) use ($index, $specialvalue) { //closure
if ($a[$index] == $b[$index]) return 0;
if ($a[$index] == $specialvalue) return -1;
if ($b[$index] == $specialvalue) return 1;
return ($a[$index] < $b[$index]) ? -1 : 1;
} ;
uasort($array, $callback);
}
$arr=array(
'a'=>array('thing'=>'yay','who'=>'owee'),
'foo'=>array('thing'=>'boo','who'=>'wik'),
'd'=>array('thing'=>'kil','who'=>'ilo'),
'b'=>array('thing'=>'ser','who'=>'uyt'),
'zed'=>array('thing'=>'efv','who'=>'qet')
);
specialSort($arr,'who','ilo');
print_r($arr);
给出结果:
Array
(
[d] => Array
(
[thing] => kil
[who] => ilo //special value
)
[a] => Array
(
[thing] => yay
[who] => owee
)
[zed] => Array
(
[thing] => efv
[who] => qet
)
[b] => Array
(
[thing] => ser
[who] => uyt
)
[foo] => Array
(
[thing] => boo
[who] => wik
)
)
保留原始第一级按键,
uasort()
。将排序规则作为二元素数组传递给回调,以便由 spaceship 运算符进行比较。因为 false
“小于”true
,请检查 OwnerNickName 是否不等于 My House,以使其成为粘性第一个元素。
代码:(演示)
uasort(
$array,
fn($a, $b) => [$a['OwnerNickName'] !== 'My House', $a['OwnerNickName']]
<=>
[$b['OwnerNickName'] !== 'My House', $b['OwnerNickName']]
);
var_export($array);