【问题标题】:Sort array and keep values of keys对数组进行排序并保留键的值
【发布时间】:2013-03-23 15:18:33
【问题描述】:

我有一个如下所示的数组:

Array
(
    [team1] => Array
        (
            [points] => 10
            [players] => Array
                (
                     ...
                )
        )

    [team2] => Array
        (
            [points] => 23
            [players] => Array
                (
                     ...
                )
        )

    ... many more teams
)

我想按每支球队的得分对球队进行排序。我试过这个:

function sort_by_points($a,$b)
{
    if ($a['points']==$b['points']) return 0;
        return ($a['points']<$b['points'])?1:-1;
}

usort($this->wordswithdata, "sortbycount");

但这种方法会覆盖包含团队名称的键并返回:

Array
(
    [0] => Array
        (
            [points] => 23
            [players] => Array
                (
                     ...
                )
        )

    [1] => Array
        (
            [points] => 10
            [players] => Array
                (
                     ...
                )
        )

    etc...
)

有没有什么方法可以在不将团队名称覆盖为数组键的情况下对数组进行排序?

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    试试这个代码,希望它能工作。

    function aasort (&$array, $key) {
        $sorter=array();
        $ret=array();
        reset($array);
        foreach ($array as $ii => $va) {
            $sorter[$ii]=$va[$key];
        }
        asort($sorter);
        foreach ($sorter as $ii => $va) {
            $ret[$ii]=$array[$ii];
        }
        $array=$ret;
    }
    
    aasort($your_array,"points");
    

    【讨论】:

      【解决方案2】:

      使用uasort 函数,它应该保持键=> 值关联不变。

      (旁注:你可以用return $a['points'] - $b['points']代替ifs)

      【讨论】:

        【解决方案3】:

        你可以使用uasort:

        uasort($array, function($a, $b) {
            return $a['points'] - $b['points'];
        });
        

        此函数使用用户定义的比较函数对数组进行排序,以便数组索引保持它们的相关性与它们关联的数组元素。

        【讨论】:

          【解决方案4】:

          你可以像这样按它的值对关联数组进行排序

          $age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");
          
          function Ascending($a, $b) {   
              if ($a == $b) {        
                  return 0;
              }   
                  return ($a < $b) ? -1 : 1; 
          }  
          
          function Descending($a, $b) {   
              if ($a == $b) {        
                  return 0;
              }   
                  return ($a > $b) ? -1 : 1; 
          }  
          
          
          echo "Ascending order" ;
          uasort($age,"Ascending");
          print_r($age);
          
          
          echo "</br>Descending order" ;
          uasort($age,"Descending");
          print_r($age);
          

          【讨论】:

            【解决方案5】:
            its working fine i giving example
            that array need sort
            $sumarray=array [▼
              484 => 54.7875
              486 => 53.5375
              487 => 52.9125
              488 => 52.2875
              493 => 54.7875
            ]
            
            $original=$sumarray;
            
             $svalue=array_values($sumarray);
              rsort($svalue);
              $sorted=array();
              foreach ($svalue as $key => $value) {
               $kk=array_search($value,$sumarray);
              $sorted[$kk]=$value;
              unset($sumarray[$kk]);
            
                }
              print_r($original);
                print_r($svalue);
              print_r($sorted);
                         //out put
              array:5 [▼
              484 => 54.7875
              486 => 53.5375
              487 => 52.9125
              488 => 52.2875
              493 => 54.7875
            ]
            array:5 [▼
              0 => 54.7875
              1 => 54.7875
              2 => 53.5375
              3 => 52.9125
              4 => 52.2875
            ]
            array:5 [▼
              484 => 54.7875
              493 => 54.7875
              486 => 53.5375
              487 => 52.9125
              488 => 52.2875
            ]
            

            【讨论】:

            • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-21
            • 1970-01-01
            • 2017-07-12
            • 2017-04-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多