【问题标题】:Sort nested array using another array with PHP使用 PHP 使用另一个数组对嵌套数组进行排序
【发布时间】:2021-02-15 06:00:25
【问题描述】:

我得到了这个数组,来自数据库。用户可以更改值的顺序

Array
 (
   [0] => 14
   [1] => 15
   [2] => 9
   [3] => 13
   [4] => 12
   ...
   [n] => n
 )

还有一个数组,会被提取到浏览器:

  Array
  (
   [0] => Array
    (
        [id] => 1
        ...
        [nr] => 9
        ...
    )
   [1] => Array
   (
        [id] => 2
        ...
        [nr] => 12
        ...
    )
    [2] => Array
   (
        [id] => 3
        ...
        [nr] => 15
        ...
    )
    [n] => Array
  )

我需要找到一种方法来按nr(不是id)对第二个数组进行排序,而nr 的顺序来自第一个数组。

有什么想法吗?

【问题讨论】:

    标签: php arrays database sorting


    【解决方案1】:

    您可以翻转第一个数组以了解 id 的顺序:

    $order = array_flip($order);
    

    那么你只需使用usort根据之前翻转的数组对数组进行排序:

    usort($array, static function(array $a, array $b) use ($order) {
        return $order[$a['nr']] <=> $order[$b['nr']];
    });
    

    【讨论】:

    • 哦,你很好!我必须仔细研究这一点!谢谢!我会标记你的答案。
    【解决方案2】:

    您可以将值映射到键,然后使用该映射重新排序。

    <?php
    
    $order = 
    [
        2,
        5,
        1
    ];
    
    $items =
    [
        ['o' => 1],
        ['o' => 5],
        ['o' => 2],
    ];
    
    foreach($items as $k => $v) {
        $map[$v['o']] = $k;
    }
    
    var_export($map);
    
    foreach($order as $o) {
        $k = $map[$o];
        $result[$k] = $items[$k];
    }
    
    var_export($result);
    

    输出:

    array (
        1 => 0,
        5 => 1,
        2 => 2,
      )array (
        2 => 
        array (
          'o' => 2,
        ),
        1 => 
        array (
          'o' => 5,
        ),
        0 => 
        array (
          'o' => 1,
        ),
      )
    

    假设存在一对一的映射。

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      相关资源
      最近更新 更多