【问题标题】:Sort multidimensional array based on another array基于另一个数组对多维数组进行排序
【发布时间】:2013-09-05 09:24:31
【问题描述】:

我有一个数组($sort),看起来像:

  [1]=>16701

  [2]=>16861

  [3]=>16706

还有一个数组($images),看起来像:

  [0]=>
  array(4) {
    ["href"]=> string(35) "mystring"
    ["url"]=>  string(67) "mystring2"
    ["didascalia"]=> string(29) "mystring3"
    ["id"]=> 16861
  }
  [1]=>
  array(4) {
    ["href"]=> string(35) "mystring"
    ["url"]=>  string(70) "mystring2"
    ["didascalia"]=> string(37) "mystring3"
    ["id"]=> 16706
  }
  [2]=>
  array(4) {
    ["href"]=> string(35) "mystring"
    ["url"]=>  string(66) "mystring2"
    ["didascalia"]=> string(24) "mystring3"
    ["id"]=> 16701
  }

我需要根据值"id" 使用$sort$images 进行排序。 所以我的结果应该是

[0]=>
array(4) {
  ["href"]=> string(35) "mystring"
  ["url"]=>  string(66) "mystring2"
  ["didascalia"]=> string(24) "mystring3"
  ["id"]=> 16701
}

[1]=>
array(4) {
  ["href"]=> string(35) "mystring"
  ["url"]=>  string(67) "mystring2"
  ["didascalia"]=> string(29) "mystring3"
  ["id"]=> 16861
}

[2]=>
array(4) {
  ["href"]=> string(35) "mystring"
  ["url"]=>  string(70) "mystring2"
  ["didascalia"]=> string(37) "mystring3"
  ["id"]=> 16706
}

我该怎么做? 我尝试使用 multisort、array_map 但没有成功。

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    由于您已经拥有所需排序顺序的 id,因此有效排序 $images 的唯一障碍是无法立即获取给定 id 的图像。所以让我们通过重新索引$images 来使用array_column 将id 作为数组键来解决这个问题(不要被名称抛出,它也可以用于重新索引):

    // array_column is only available in PHP 5.5+
    $images = array_column($images, null, 'id');
    

    在这之后,得到一个排序数组就很简单了:

    $sortedImages = [];
    foreach ($sort as $id) {
        $sortedImages[] = $images[$id];
    }
    

    对于 PHP array_column 重新索引替换为:

    $imageIds = array_map(function($i) { return $i['id']; }, $images);
    $images = array_combine($imageIds, $images);
    

    您也可以得到array_column 的作者本人的implementation written in PHP

    【讨论】:

    • 老实说,我不明白你的解决方案,但它有效,所以谢谢。我只需要用$sortedImages = array(); 替换$sortedImages = [];,因为它给了我一个错误。
    • @topoftheforts:不清楚的是重新索引部分还是循环部分?发生[] 错误是因为这是 PHP 5.4 引入的新(紧凑)数组文字语法,而您似乎使用的是 5.3。
    • 重新索引,但我应该在要求解释之前检查您使用的两个函数,所以别担心,这只是我的无知 :) 好的,请清除错误!谢谢
    【解决方案2】:

    试试这个:

    $final = array();
    
    foreach ($sort as $key) {
       foreach ($images as $img) {
          if($img['id'] == $key) {
             $final[] = $img;
          }
       }
    }
    
    print_r($final);
    

    【讨论】:

    • 这不是一个糟糕的解决方案,但我一直在寻找性能方面更好的解决方案。在我的示例中,有三个元素,但我的真实数组有 ~20。所以这意味着大约 400 次迭代,太多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多