【问题标题】:Order Associative Array by Specific Key Values按特定键值排序关联数组
【发布时间】:2014-06-17 21:06:22
【问题描述】:

我有以下数组:

   $data=array(
   'Points'=>$points,'Name'=>$row['Name'], 'Phone'=>$row['phone']
    );

这位于我的 Codeigniter 控制器索引函数中的 for each 循环中:

public function index(){

    $query=$this->My_model->get_data();
    foreach ($query as $row)
    {
           $data=array(
           'Points'=>$points,'Name'=>$row['Name'], 'Phone'=>$row['phone']
            );

    }
}

目前如果我在 $data 上 print_r 会产生:

Array ( [Points] => 500 [Name] => Dave Laus ) 
Array ( [Points] => 1200 [Name] => John Smith ) 
Array ( [Points] => 700 [Name] => Jason Smithsonian ) 

但是我想对此进行排序/排序,以便首先显示最高点的用户如下所示:

Array ( [Points] => 1200 [Name] => John Smith ) 
Array ( [Points] => 700 [Name] => Jason Smithsonian ) 
Array ( [Points] => 500 [Name] => Dave Laus ) 

我想按“Points”键对数组进行排序,让得分最高的用户首先出现。我想重新排序数组以从最高点到最低点显示。

我已经尝试过 usort 和 arsort 和 ksort。我还没有让它工作。

我该怎么做?

我在我的控制器中尝试了这个,但它不起作用,而是错误:

public function index(){

    $query=$this->My_model->get_data();
    foreach ($query as $row)
    {
           $data=array(
           array('Points'=>$points,'Name'=>$row['Name'], 'Phone'=>$row['phone']),
            );

           function cmp ($a, $b) {
        return $a['Points'] < $b['Points'] ? 1 : -1;
        }

        usort($data, "cmp");

            print_r($data);


                //I also tried usort($leaders, array('home', 'cmp')); whcih gave no errors, but was the same result as before, not ordered


        }
    }

【问题讨论】:

  • 应该是 $data[]= array... 对吧?否则你每次都重写同一个数组
  • 如果您提供更好的数据示例会更有帮助。您说您想按 Points 键排序,但您向我们展示了一个一维数组 - 只有一个 Points 键。向我们展示排序前的数据示例,以及您希望它的外观。
  • @MarkM 请查看编辑
  • 应该还显示你尝试过的usort/ksort的代码。

标签: php arrays codeigniter foreach associative-array


【解决方案1】:

试试这个:

function cmp ($a, $b) {
    return $a['Points'] < $b['Points'] ? 1 : -1;
}

usort($data, "cmp");

See Demo

【讨论】:

  • 试过这个,在 OP 中查看上面的代码,但我得到了错误。认为 CodeIgniter 标签会很好,应该也在 OP 中说明它。
  • 我也尝试过使用 usort($leaders, array('home', 'cmp'));,没有错误,但它产生了相同的无序数组。
  • @Tester $cmp=$this-&gt;cmp($a,$b) 是行不通的。将cmp 函数直接放在index 函数中,并按照我的答案中的方式调用它。另外,不知道$leaders 来自哪里...以为是$data...
  • 我尝试过这种方式(参见上面的代码编辑),它只打印数组中的第一项“Array([0] => Array([Points] => 500 [Name] = > Lerielle Cole ) )”,并在我放置代码的控制器文件中打印的“致命错误:无法重新声明 cmp()(以前在.....中声明”)下给出错误。
  • 好的,我确实修复了它,是一个小错误,现在当我打印或回显时,我可以看到现在按点排序的列表。但是,我在上述评论中描述的致命错误仍然存​​在,因此页面无法通过视图显示结果,只有当我通过控制器打印或回显时。关于如何摆脱致命错误的任何想法? @Mark M
【解决方案2】:

我建议你使用 usort function。您必须创建一个回调函数来比较数组的 2 个元素。您在我提供的链接中有排序过程使用的此类回调函数的示例。

【讨论】:

    【解决方案3】:

    以下函数将允许您使用特定字段以及方向(asc 或 desc)对给定数组进行排序。 它接受参数为

    // $field = field / key for sorting
    // $array = array to sort
    // $direction = ascending or descending sort direction (default is ascending)
    
    
    function sortBy($field, &$array, $direction = 'asc')
    {
        usort($array, create_function(  '$a, $b', '
                                         $a = $a["' . $field . '"];
                                         $b = $b["' . $field . '"];
                                         if ($a == $b) {
                                             return 0;
                                         }
    
                                         return ($a ' . ($direction == 'desc' ? '>' : '<') .' $b) ? -1 : 1;'));
    
        return true;
    }
    

    现在使用以下代码对数组进行实际排序

    sortBy('Points', $data, 'desc'); // sorts in descending order for value of key Points
    sortBy('Name', $data, 'asc'); // sorts in ascending order for value of key Name
    

    我建议你看看下面的链接 http://phpave.com/sorting-associative-array-specific-key/

    【讨论】:

      猜你喜欢
      • 2020-06-03
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 2012-01-03
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多