PHP数组uasort

时间:2017-04-04 18:18:30

标签: php arrays compare

我有以下数组与php

// array stored in $items    
Array
    (
        [0] => Array
            (
                [description] => some text
                [value] => 20
            )
        [1] => Array
            (
                [description] => bord
                [value] => 5
            )
        [2] => Array
            (
                [description] => axe
                [value] => 99
            )
    )

我想要的是bord的描述是最后一个元素。我知道php有函数uasort来编写你自己的自定义排序函数。

我尝试的是以下

uasort($items, function($a, $b){
    if($a['description'] == 'bord'){
      return 0;  
    } 

    return ($a['description'] < $b['description']) ? -1 : 1;
});

但无法弄清楚这是如何运作的。

更新 uasort之后的结果

Array
(
    [2] => Array
        (
            [description] => axe
            [value] => 99
        )

    [1] => Array
        (
            [description] => bord
            [value] => 5
        )

    [0] => Array
        (
            [description] => some text
            [value] => 20
        )
)

如果我使用以下uasort:

uasort($items, function($a, $b){
    if($a['description'] == 'bord'){
      return 1;  
    } 

    return -1;
});

结果是正确的,但我从未使用过$ b。

3 个答案:

答案 0 :(得分:3)

通过返回0,您告诉它单独留下'bord'项目的位置,并且只有当它是比较中的第一个变量($ a)时。如果你想强迫它到底部,你需要告诉它如何在两种情况下对待'bord'。

uasort($items, function($a, $b){
    if($a['description'] == 'bord'){
      return 1;  
    }

    if ($b['description'] == 'bord') {
        return -1;
    }

    return ($a['description'] < $b['description']) ? -1 : 1;
});

编辑:为了解释一点,uasort()在提供的数组中抓取彼此相邻的两个元素,并将它们分配给$ a和$ b变量。当您的比较函数返回正数时,则表示$ a应移至比$ b更低的位置。当它返回负数时,$ a应该高于$ b。当它返回零时,则$ a和$ b相等。

如果我将数组简化为$items = ['some_text', 'bord', 'axe'];并运行类似的uasort函数,那么步骤将如下所示:

  1. bordsome text进行比较,结果= 1

    新订单:['some_text', 'bord', 'axe']

  2. axebord进行比较,结果= -1

    新订单:['some_text', 'axe', 'bord']

  3. some textaxe进行比较,结果= 1

    新订单:['axe', 'some_text', 'bord']

  4. 最后一个是最终结果。

答案 1 :(得分:2)

uasort用于关联数组,但您的数组不是这种情况。您应该使用usort代替。

usort($items, function($a, $b){
    if($a['description'] == 'bord'){
        return 1;  
    } 
   if($b['description'] == 'bord'){
        return -1;  
    } 
    return 0;
});

这是如何工作的:你希望description ='bord'的元素是最后一个。这意味着你认为它比其他元素“更大”。如果考虑$ a更大,则必须返回1;如果考虑$ b更大,则返回-1。

这里我们为所有其他情况返回0,这意味着他们的订单将保持不变。

答案 2 :(得分:0)

foreach($items as $key => $thing) {
if(in_array("bord",$key[description])) { 
    //set aside 
      $last_description=$key[description];
      $last_value=$key[value];
                                           }

$new_array[]=array("description"=>$key[description],"value"=>$key[value];
}    //now, add it back on
$new_array[]=array("description"=>$last_description,"value"=>$last_value);

对于更大的数组,这可能会变慢