【问题标题】:PHP usort Multi-dimensional arrayPHP usort 多维数组
【发布时间】:2018-03-20 23:42:27
【问题描述】:

我无法让 usort 工作,并且不确定我缺少什么。下面是我的数组的一个例子。我想根据排序键的值对数组进行排序。

Array
(
[0] => Array
    (
        [sort] => 1520546956
        [row] => Data lives here
    )

[1] => Array
    (
        [sort] => 1521047928
        [row] => Data lives here
    )

[2] => Array
    (
        [sort] => 1520525366
        [row] => Data lives here
    )

[3] => Array
    (
        [sort] => 1520525227
        [row] => Data lives here
    )

我尝试排序的代码是:

foreach ($resultsArray as $record)
{
    usort($record['sort'], function($a, $b)
        {
            if ($a == $b)
                {
                    return 0;
                }
            return ($a < $b) ? -1 : 1;  
        });
}

但是我的代码似乎无效,因为数组的顺序没有改变。我觉得我很接近,但无法确定我错过了什么。感谢您的帮助!

【问题讨论】:

  • $record 将是数组元素的副本,而不是引用。因此,您对元素所做的任何更改都不会保留。要解决此问题,请在排序后执行foreach($resultsArray as $index=&gt;$record),然后执行$resultsArray[$index] = $record,或者执行foreach($resultsArray as &amp;$record)——注意第二个示例中的&amp;
  • 此外,您的排序逻辑本身已关闭。 usort 对给定数组进行就地排序。因此,$record['sort'] 应该是一个数组。如果您想正确使用usort,请使用usort($resultsArray, function($a, $b) { /* compare $a['sort'] and $b['sort'] */ }!这将完全避免使用foreach 循环。
  • @B.Fleming 成功了——最终使用usort($resultsArray, function($a, $b) { /* compare $a['sort'] and $b['sort'] */ } 并且现在可以正常工作。谢谢!

标签: php arrays usort


【解决方案1】:

实现相同功能的另一种方法是将array_multisort 与所需的排序标志组合一起使用。

数据集:

$resultsArray = array(
  array('sort'=>1520546956, 'row'=>'row 0 data'),
  array('sort'=>1521047928, 'row'=>'row 1 data'),
  array('sort'=>1520525366, 'row'=>'row 2 data'),
  array('sort'=>1520525227, 'row'=>'row 3 data')
);

array_multisort 示例:

$sortValues = array_column($resultsArray, 'sort');
array_multisort($sortValues, SORT_ASC, $resultsArray);
print_r($resultsArray);

结果:https://3v4l.org/NpVIc

Array
(
    [0] => Array
        (
            [sort] => 1520525227
            [row] => row 3 data
        )

    [1] => Array
        (
            [sort] => 1520525366
            [row] => row 2 data
        )

    [2] => Array
        (
            [sort] => 1520546956
            [row] => row 0 data
        )

    [3] => Array
        (
            [sort] => 1521047928
            [row] => row 1 data
        )

)

您仍然可以使用usort,但在您的函数中,您需要检索名为sort 的关联数组键以比较值。

usort 示例:

usort($resultsArray, function($a, $b) { 
    if ($a['sort'] == $b['sort']) {
        return 0;
    }
    return ($a['sort'] < $b['sort'] ? -1 : 1);
});
print_r($resultsArray);

结果:https://3v4l.org/5nfbc

【讨论】:

    【解决方案2】:

    按照建议修改代码以反映以下内容:

    usort($resultsArray, function($a, $b) { /* compare $a['sort'] and $b['sort'] */ }
    

    完美运行。

    【讨论】:

      【解决方案3】:

      $record['sort'] 必须是一个数组才能工作。然而,它什么也没做。

      我很确定你想这样做:

      <?php
      $multiArray = array(
        array('sort'=>1520546956, 'row'=>'row 0 data'),
        array('sort'=>1521047928, 'row'=>'row 1 data'),
        array('sort'=>1520525366, 'row'=>'row 2 data'),
        array('sort'=>1520525227, 'row'=>'row 3 data'));
      foreach($multiArray as $a){
        $numArray[] = $a['sort'];
      }
      asort($numArray, SORT_NUMERIC);
      foreach($numArray as $k => $v){
        $resArray[] = $multiArray[$k];
      }
      print_r($resArray);
      ?>
      

      【讨论】:

        【解决方案4】:

        这是因为 php foreach 构造适用于提供的数组的副本(即:$resultsArray),其中 php usort() 函数引用或指向同一个数组。这就是为什么您的代码无法按预期工作的原因。 如果您不理解这个概念,我建议您在 Lynda.com 上由 Kevin skoglund (php 基本培训)提供的一个很好的在线课程

        【讨论】:

        • @Oighea 我没有问任何问题,但已经回答了。澄清你想说的话。
        • 语法不正确。需要正确的语法,因为这不是聊天室,也不是非正式讨论区。
        猜你喜欢
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 2019-02-08
        • 2016-07-13
        相关资源
        最近更新 更多