php 基于另一个数组对多维数组排序[重复]

wfauudbj  于 2023-01-29  发布在  PHP
关注(0)|答案(3)|浏览(213)
    • 此问题在此处已有答案**:

Sorting a php array of arrays by custom order(8个答案)
4天前关闭。
我有一个数组($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
  }

我需要使用$sort,基于值"id"$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
}

我该怎么做呢?我试过使用多重排序,array_map,但是没有成功。

vs3odd8k

vs3odd8k1#

既然已经有了想要的排序顺序的id,那么对$images进行有效排序的唯一障碍就是无法立即获取给定id的图像。因此,让我们使用array_column重新索引$images,将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〈5.5,你可以用以下代码替换array_column重索引:

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

或者,您可以获得array_column作者自己的implementation written in PHP

xytpbqjk

xytpbqjk2#

试试这个:

$final = array();

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

print_r($final);
2guxujil

2guxujil3#

在PHP7+中,可以使用usort和一个使用shipper操作符的匿名比较函数,根据另一个数组描述的另一个数组直接对输入数组进行就地排序

<?php
$sort = [16701, 16861, 16706];
$images = ...; // input array

// Create assoc array mapping the IDs in $sort to their desired sorted position.
$idOrder = array_combine($sort, range(0, count($sort)-1));

// Sort $images in-place according to the 'id' key, using the order
// described by $idOrder.
usort($images, function ($left, $right) use ($idOrder) {
    return $idOrder[$left['id']] <=> $idOrder[$right['id']];
});

相关问题