【问题标题】:Sorting an array of an array of objects in PHP by key value在PHP中按键值对对象数组的数组进行排序
【发布时间】:2010-09-29 17:13:48
【问题描述】:

基本上我有如下设置:

Array ( 
[0] => Array ( [0] => stdClass Object ( [nid] => 1 [title] => title1 [uid] => 1 [parent] => 0 [weight] => -15 [name] => name1 [value] => 0 )
               [1] => stdClass Object ( [nid] => 2 [title] => title2 [uid] => 1 [parent] => 0 [weight] => -7 [name] => name2 [value] => 100 )
               [2] => stdClass Object ( [nid] => 3 [title] => title3 [uid] => 2 [parent] => 0 [weight] => -1 [name] => name3 [value] => 0 )
               [3] => stdClass Object ( [nid] => 4 [title] => title4 [uid] => 2 [parent] => 0 [weight] => 1 [name] => name4 [value] => 80 )
              )
  )

我需要的是一种通过 Object.我已经用 usort 和不同的方法尝试了大约 2 天,但我似乎无法理解它。 [value] 键的范围从 0 到 100,我需要按降序排序的所有数组(即:100 到 0)。

【问题讨论】:

    标签: php arrays object sorting key


    【解决方案1】:

    我可能是错的,但我相信我使用 asort()(或 asort())做了类似的事情。它在一个搜索功能中,我需要对一个包含索引和时间戳的二维数组进行排序。

    我不确定它是否适用于您的情况,我很久以前就这样做了。也许它会让你开始,祝你好运。

    【讨论】:

      【解决方案2】:

      使用usort:

      function cmp($a, $b) {
        if ($a->value == $b->value) {
          return 0;
        } else {
          return $a->value < $b->value ? 1 : -1; // reverse order
        }
      }
      
      usort($arr, 'cmp');
      

      【讨论】:

      • 在 else 子句中,只需将第一个 : 替换为 ?返回 $a->value value ? 1:-1; // 倒序
      【解决方案3】:
      function cmp($a, $b) {
          return $b->value - $a->value;
      }
      
      $ary[0] = usort($ary[0], "cmp");
      

      要根据简单值或键以外的任何内容对数组进行排序,您需要使用usort 函数并提供您自己的比较。必须定义比较函数,使得如果$a$b 之前,则返回正值,如果$b$a 之前返回负值(如果它们相等,则返回零)。当您基于数值进行比较并且想要反向排序时,最简单的方法是从 $b 的值中减去 $a 的“值”。

      【讨论】:

        【解决方案4】:

        这样做的一种方法是将值数组与对象数组分开,从而创建两个数组。然后,您可以使用 array_multisort 根据另一个数组对对象数组进行排序。这是一个例子:

        <?php
        $array1 = $objectvalues
        $array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4);
        array_multisort($array1, $array2);
        ?>
        

        您可以使用foreach循环一次数组并使用相应的[value]键创建一个新数组:

        <?php
        foreach( $arraywithobjects as $obj )
        {
            $objectvalues[] = $obj->getValue();
        }
        ?>
        

        这将获取对象的值并将其插入到另一个数组中,您可以将其与多重排序一起使用。

        最后,您的代码将如下所示:

        <?php
        foreach( $arraywithobjects as $obj )
        {
            $objectvalues[] = $obj->getValue();
        }
        $array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4);
        array_multisort($objectvalues, $array2);
        ?>
        

        array_multisort 字段中的第一个数组应该是您用来对第二个数组进行排序的数组。

        您还可以为此添加其他排序方法。你可以在这里阅读它们:link text

        【讨论】:

          【解决方案5】:

          100% 从本页的第一个答案中窃取。 http://us.php.net/manual/en/function.array-multisort.php
          但这是我一直在寻找的。

          对对象数组进行多重排序:

          example object [$object with array of objects]: (class: test) 
          ---------------------------------- 
          
          test Object (
            [Artikel] => Array (
                [0] => test Object (
                      [id] => 1
                      [title] => CCCC
                   )
                [1] => test Object (
                      [id] => 2
                      [title] => AAAA
                   )
                [2] => test Object (
                      [id] => 3
                      [title] => DDDD
                   )
                [3] => test Object (
                      [id] => 4
                      [title] => BBBB
                   )
             )
          )
          
          ---------------------------------- 
          
          Simple PHP function: sort_arr_of_obj()
          
          <?php 
          // -------------------------------------- 
          
          /* 
          * -------- function arguments -------- 
          *   $array ........ array of objects
          *   $sortby ....... the object-key to sort by
          *   $direction ... 'asc' = ascending
          * --------
          */
          
          function sort_arr_of_obj($array, $sortby, $direction='asc') {
          
              $sortedArr = array();
              $tmp_Array = array();
          
              foreach($array as $k => $v) {
                  $tmp_Array[] = strtolower($v->$sortby);
              }
          
              if($direction=='asc'){
                  asort($tmp_Array);
              }else{
                  arsort($tmp_Array);
              }
          
              foreach($tmp_Array as $k=>$tmp){
                  $sortedArr[] = $array[$k];
              }
          
              return $sortedArr;
          
          }
          
          
          // -------------------------------------- 
          ?>
          
          example call: 
          ---------------------------------- 
          
          <?php 
          
          $sorted->Artikel = sort_arr_of_obj($object->Artikel,'title','asc');
          
          ?>
          
          example result: $sorted (class: test) 
          ---------------------------------- 
          
          test Object (
            [Artikel] => Array (
                [0] => test Object (
                      [id] => 2
                      [title] => AAAA
                   )
                [1] => test Object (
                      [id] => 4
                      [title] => BBBB
                   )
                [2] => test Object (
                      [id] => 1
                      [title] => CCCC
                   )
                [3] => test Object (
                      [id] => 3
                      [title] => DDDD
                   )
          
             )
          )
          

          【讨论】:

          • 刚刚遇到这个解决方案。也为我工作!谢谢 :) 我确实需要稍微调整一下,因为它为我返回了空数组。 $tmp_Array[$k] = strtolower($v->$sortby);
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-30
          • 1970-01-01
          • 2020-07-11
          • 2023-03-18
          • 1970-01-01
          相关资源
          最近更新 更多