【问题标题】:Sorting an associative array in PHP [duplicate]在PHP中对关联数组进行排序[重复]
【发布时间】:2010-10-21 03:02:33
【问题描述】:

我有一个这种格式的数组:

Array
(
    [0] => Array
        (
            [text] => tests
            [language] => 
            [advertiserCompetitionScale] => 5
            [avgSearchVolume] => 7480000
            [lastMonthSearchVolume] => 9140000
        )

    [1] => Array
        (
            [text] => personality tests
            [language] => 
            [advertiserCompetitionScale] => 5
            [avgSearchVolume] => 165000
            [lastMonthSearchVolume] => 201000
        )

    [2] => Array
        (
            [text] => online tests
            [language] => 
            [advertiserCompetitionScale] => 5
            [avgSearchVolume] => 246000
            [lastMonthSearchVolume] => 301000
        )

)

如何按avgSearchVolume 字段的降序对该格式的数组进行排序?有内置函数吗?

【问题讨论】:

  • 这不是关联数组...而是关联数组的数组;-)
  • 是的,关联数组的索引数组

标签: php arrays sorting


【解决方案1】:

使用usort 并提供您自己的函数来进行排序,例如

function cmp($a, $b)
{
    return $b['avgSearchVolume'] - $a['avgSearchVolume'];
}

usort($array, "cmp");

【讨论】:

【解决方案2】:

在 PHP 5.3 之前,这是基于子键排序的最佳函数,无需为每个键创建新函数。

function sortBySubkey(&$array, $subkey, $sortType = SORT_ASC) {
    foreach ($array as $subarray) {
        $keys[] = $subarray[$subkey];
    }
    array_multisort($keys, $sortType, $array);
}
sortBySubkey($arr, 'avgSearchVolume');

使用 PHP 5.3,您可以像现在一样进行类似的函数调用。

function getSortVariable($sortType = SORT_ASC) {
    switch($sortType) {
        case SORT_ASC:
            return function ($a, $b) use ($subkey) { return strcmp($a[$subkey], $b[$subkey]); };
    }
}

function sortBySubkey(&$array, $subkey, $sortType = SORT_ASC) {
    $sortFunction = getSortVariable($sortType);
    usort($array, $sortFunction($subkey));
}

【讨论】:

    【解决方案3】:

    您必须将自定义回调函数与usort() 一起使用。

    function cmp($a, $b)
    {
        if ($a['avgSearchVolume'] == $b['avgSearchVolume']) {
            return 0;
        }
        return ($a['avgSearchVolume'] > $b['avgSearchVolume']) ? -1 : 1;
    }
    usort($array, 'cmp');
    

    【讨论】:

    • 虽然这会起作用,但如果两个被比较的元素相等,比较函数应该真正返回 0。
    • 你说得对,Paul - 但由于在相等的情况下排序顺序未定义,更好的解决方案是引入另一个比较来消除这种不确定性。相应地编辑了答案。
    【解决方案4】:
    function querySort ($first_Array,$second_Array) {
        return strcasecmp($first_Array['name'],$second_Array['name']);
    }
    echo '<pre>';
    usort($main, 'querySort');
    
    print_r($main);
    die;
    

    【讨论】:

    • 几句话的解释会让这个代码示例变得更好。
    【解决方案5】:

    这里是另一种解决方案,您可以添加多个排序选项(参见代码的注释部分)

    <?php
    
    $arr=Array(
         Array("text" => "tests","language" =>"","advertiserCompetitionScale" => 5,"avgSearchVolume" => 7480000,"lastMonthSearchVolume" => 9140000),
         Array("text" => "personality tests","language" =>"","advertiserCompetitionScale" => 5,"avgSearchVolume" => 165000,"lastMonthSearchVolume"=>201000),
         Array("text" => "online tests","language" =>"","advertiserCompetitionScale" => 5,"avgSearchVolume" => 246000,"lastMonthSearchVolume" =>301000)
         );
    
    
    $sort = array();
    foreach($arr as $k=>$v) {
        $sort['avgSearchVolume'][$k] = $v['avgSearchVolume'];
        //$sort['text'][$k] = $v['text'];
    }
    
    array_multisort($sort['avgSearchVolume'], SORT_DESC, $arr);
    //array_multisort($sort['avgSearchVolume'], SORT_DESC, $sort['text'], SORT_ASC,$arr);
    
    echo "<pre>";
    print_r($arr);
    
    ?>
    

    参考号:http://php.net/manual/en/function.array-multisort.php

    【讨论】:

      猜你喜欢
      • 2014-05-22
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2011-06-01
      • 2011-07-26
      • 2019-04-01
      相关资源
      最近更新 更多