【问题标题】:Sort and display array values according to a value?根据值排序和显示数组值?
【发布时间】:2011-01-09 20:55:14
【问题描述】:

给定以下 PHP 数组:

Array
(
    [0] => Array
        (
            [name] => Restaurant 123
            [city] => Arlington
            [zip] => 22201
        )

    [1] => Array
        (
            [name] => Bar Foo
            [city] => Ballston
            [zip] => 22201
         )
     [2] => Array
        (
            [name] => Restaurant XYZ
            [city] => Ballston
            [zip] => 22201
         )

    [3] => Array
        (
            [name] => Restaurant 321
            [city] => Washington DC
            [zip] => 22201
         )

)

如何生成按城市(按字母顺序)排序的列表,以便输出如下内容:

阿灵顿

餐厅 123

鲍尔斯顿

吧友

餐厅 XYZ

华盛顿特区

餐厅 321

E.G.,首先按城市名称字母顺序排序,然后按场地名称,也按字母顺序排序。另请注意,没有给出餐厅名称,也没有给出城市在给定数组中按字母顺序排序。

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    写一个回调函数,例如可以传递给usort

    function compare_venues($a, $b)
    {
      return strcmp($a['name'], $b['name']);
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用usort,它使您能够根据用户定义的比较函数对数组进行排序。

      【讨论】:

        【解决方案3】:

        尝试使用 usort (http://php.net/manual/en/function.usort.php),您可以在其中定义自定义排序模式,例如

        function cmp($a, $b)
        {
            if ($a == $b) {
                return 0;
            }
            return ($a < $b) ? -1 : 1;
        }
        

        【讨论】:

          【解决方案4】:

          看起来你想要的有两部分 - 排序和显示。

          要排序,您想使用 usort 和定义比较的小函数

          $sortFunc = function($a,$b) {return $a['city'] != $b['city'] 
                                           ? $a['city'] > $b['city']
                                           : $a['name'] > $b['name'];};
          
                  // = function($a,$b) {return $a['city'] > $b['city'] || ($a['city'] == $b['city'] && $a['name'] > $b['name']);};
                  // = function($a,$b) {return 100*strcmp($a['city'],$b['city']) + strcmp($a['name'],$b['name']);};
          usort($arr, $sortFunc);
          
          function displayNamesGroupedByCity($arr)
          {
              $lastCity = '';
              foreach($arr as $v)
              {
                  if ($v['city'] != $lastCity)
                  {
                       $lastCity = $v['city'];
                       echo "<br /><strong>$lastCity</strong><br />";
                  }
                  else echo ', ';
                  echo $v['name'];
              }
          }
          
          displayNamesGroupedByCity($arr);
          

          我要让事情变得通用

          function displayXgroupedByY($arr, $x, $y)
          {
              $sortFunc = function($a,$b) use($x,$y) 
                                         {return $a[$y] != $b[$y] 
                                           ? $a[$y] > $b[$y]
                                           : $a[$x] > $b[$y];};
          
              user($arr, $sortFunc);
          
              $lastCity = '';
              foreach($arr as $v)
              {
                  if ($v['city'] != $lastCity)
                  {
                       $lastCity = $v['city'];
                       echo "<br /><strong>$lastCity</strong><br />";
                  }
                  else echo ', ';
                  echo $v['name'];
              }
              return $arr;
          }
          
          displayXGroupedByY($arr, 'name', 'city');
          

          【讨论】:

          • 嗨,乔恩,我尝试了你的排序功能,但 print_r($sorted) 只给了我“1”而不是排序列表?除了丢失的撇号,我猜是这样删除的。
          • 是的,我修好了。 usort 就地排序,返回值为布尔值
          • 好的,很酷,这几乎可以工作,除了项目似乎是相反的顺序,例如。城市和场馆都倒退了?
          • 哈哈,我自己也注意到了。你把比较改成比我猜的少了?
          • 我只是把 $sortFunc = function() 中的 $a, $b 倒过来了 :)
          【解决方案5】:

          用户定义的排序应该做的工作:

          http://us2.php.net/manual/en/function.uasort.php

          【讨论】:

            猜你喜欢
            • 2020-06-17
            • 2017-12-25
            • 1970-01-01
            • 1970-01-01
            • 2015-04-08
            • 1970-01-01
            • 1970-01-01
            • 2012-11-15
            • 1970-01-01
            相关资源
            最近更新 更多