【问题标题】:PHP - Sort a multidimensional arrays subsubarray from valuePHP - 从值中对多维数组子子数组进行排序
【发布时间】:2015-10-30 05:07:10
【问题描述】:

数组

array (
  [0] => array 
    (
      [field1] => 'name'
      [field2] => 'text'
      [field3] => array 
        (
          [0] => array 
            (
              [text] => 'This arrays order is to be kept!'
              [name] => 'Only sort the sub-sub-array below!'
              [order] => ''
            )
        )
    )

  [1] => array
    (
      [field1] => 'name'
      [field2] => 'text'
      [field3] => array 
        (
          [0] => array 
            (
              [text] => '2014'
              [name] => 'Dummy!'
              [order] => '1'
            )
          [1] => array 
            (
              [text] => '2013'
              [name] => 'Try me!'
              [order] => '2'
            )
          [2] => array 
            (
              [text] => '1985'
              [name] => 'Help!'
              [order] => '5'
            )
          [3] => array 
            (
              [text] => '2002'
              [name] => 'Please!'
              [order] => '4'
            )
          [4] => array 
            (
              [text] => '2007'
              [name] => 'Order!'
              [order] => '3'
            )
        )
    )
...

目标

我想保留第 1 级和第 2 级数组及其值。我需要按order-字段中的值对第二个子子数组中的键进行排序。因此,在它表示年份的地方,该子子数组应该按 ASC 或 DESC 排序。并且所有其他键/值/结构/映射应保持原样。

排序数组:

array (
  [0] => array 
    (
      [field1] => 'name'
      [field2] => 'text'
      [field3] => array 
        (
          [0] => array 
            (
              [text] => 'This arrays order is to be kept!'
              [name] => 'Only sort the sub-sub-array below!'
              [order] => ''
            )
        )
    )

  [1] => array
    (
      [field1] => 'name'
      [field2] => 'text'
      [field3] => array 
        (
          [0] => array 
            (
              [text] => '2014'
              [name] => 'Dummy!'
              [order] => '1'
            )
          [1] => array 
            (
              [text] => '2013'
              [name] => 'Try me!'
              [order] => '2'
            )
          [2] => array 
            (
              [text] => '2007'
              [name] => 'Order!'
              [order] => '3'
            )
          [3] => array 
            (
              [text] => '2002'
              [name] => 'Please!'
              [order] => '4'
            )
          [4] => array 
            (
              [text] => '1985'
              [name] => 'Help!'
              [order] => '5'
            )
        )
    )

帮助

我花了好几个小时尝试不同的自定义解决方案,主要基于usort(),但我也知道这些问答都没有描述我所遇到的情况。

我开始怀疑这是否可能。 有谁知道是不是?如果是这样,您能否提供一些启发或提供提示/教程/示例以进行演示?

Laravel 5.1

我正在从 Laravel 模型中检索它并使用 toArray();

有没有更好的方法在 Laravel 中实现这一点,我很高兴知道。

【问题讨论】:

  • 请发布数组排序后的样子。这样我就可以理解您想要实现的目标。

标签: php arrays sorting multidimensional-array laravel-5


【解决方案1】:

如果我正确理解了问题,这可能是一个解决方案(在这些示例中,$arr 是保存数组的变量):

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

foreach($arr as $key => $subarr){
    foreach($subarr as $key2 => $subsubarr){
        if(is_array($subsubarr)){             
                usort($subsubarr,"cmp");
                $subarr[$key2] = $subsubarr;
        }
    }
    $arr[$key] = $subarr;

}

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

foreach($arr as  &$subarr){
    foreach($subarr as  &$subsubarr){
        if(is_array($subsubarr)){               
                usort($subsubarr,"cmp");
        }
    }        
}

【讨论】:

    【解决方案2】:

    如果您要排序的子子数组始终由相同的键标识,则只需对该键的内容进行排序即可。

    foreach ($test as &$value) { 
          // Using a (^) reference to each value will sort the existing 
          // array instead of creating a sorted copy.
        usort($value['field3'], function($a, $b) {
            // You can use an anonymous function like this for the usort comparison function.
            if ($a['order'] < $b['order']) return -1;
            if ($a['order'] == $b['order']) return 0;
            // In case of 'order' ties, you may want to add a comparison of a different key
            return 1; // $a['order'] must be > $b['order'] at this point
        });
    }
    

    注意usort中使用的比较函数:

    如果第一个参数分别被认为小于、等于或大于第二个参数,则必须返回一个小于、等于或大于零的整数。

    使用 Laravel 可能会更好,因为数据库很可能能够比 PHP 更快地进行这种排序,但我们需要更多地了解您的模型设置才能弄清楚这一点,这听起来像基本上是一个完全不同的问题。

    【讨论】:

    • 这似乎是实现我目标的最简单方法,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-05-29
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2012-06-15
    相关资源
    最近更新 更多