当找到特定值时,按列值对多维数组的行进行排序,并使用粘性第一行

问题描述 投票:0回答:3

我的多维数组按

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 */ ]
    ]
]
php sorting multidimensional-array associative-array sticky
3个回答
3
投票

您可能想实现自己的排序功能,例如:

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

1
投票

如果您想改变对哪个索引排序或哪个值应该特殊的想法,这样的事情可能适合:

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
        )

)

0
投票

保留原始第一级按键,

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);
© www.soinside.com 2019 - 2024. All rights reserved.