php 按基于另一个数组的值对关联数组排序[重复]

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

Sort multidimensional array based on another array [duplicate](3个答案)
4天前关闭。
大家好,我有一个如下所示的数组

array[
   0 => array[
         'id'  => 1,
         'name' => 'Test 1'
         'classId' => 3
       ],
  1 => array[
         'id'  => 1,
         'name' => 'Test 1'
         'classId' => 15
       ],
  2 => array[
         'id'  => 1,
         'name' => 'Test 1'
         'classId' => 17
       ],
]

我有另一个包含classIds的数组,如:

classIds = [15, 17, 3]

我想根据classId对数组进行排序
我可以做一个双循环来比较它。我只是想知道有没有其他的方法来完成它?

s8vozzvw

s8vozzvw1#

实际上一个循环就足够了:

<?php
$order = [15, 17, 3];
$input = [
  [
    'id'  => 1,
    'name' => 'Test 1',
    'classId' => 3,
  ],
  [
    'id'  => 1,
    'name' => 'Test 1',
    'classId' => 15,
  ],
  [
    'id'  => 1,
    'name' => 'Test 1',
    'classId' => 17,
  ],
];
$output = [];
array_walk($input, function($entry) use ($order, &$output) {
  $output[array_search($entry['classId'], $order)] = $entry;
});
ksort($output);
print_r($output);

如果你认为array_search(...)也是一个“循环”(尽管它内部的工作方式不同),那么这将是一个产生相同输出的替代方案:

<?php
$order = array_flip([15, 17, 3]);
$input = array_values([
  [
    'id'  => 1,
    'name' => 'Test 1',
    'classId' => 3,
  ],
  [
    'id'  => 1,
    'name' => 'Test 1',
    'classId' => 15,
  ],
  [
    'id'  => 1,
    'name' => 'Test 1',
    'classId' => 17,
  ],
]);
$output = [];
array_walk($input, function($entry, $index) use ($order, &$output) {
  $output[$order[$entry['classId']]] = $entry;
});
ksort($output);
print_r($output);

这两种方法的输出为:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Test 1
            [classId] => 15
        )
    [1] => Array
        (
            [id] => 1
            [name] => Test 1
            [classId] => 17
        )
    [2] => Array
        (
            [id] => 1
            [name] => Test 1
            [classId] => 3
        )
)
kupeojn6

kupeojn62#

您可以使用usort和一个匿名比较函数(从$classIds检索目标索引)直接对数组进行就地排序。
给定

<?php
$arr = array(
   0 => array(
         'id'  => 1,
         'name' => 'Test 1',
         'classId' => 3
       ),
  1 => array(
         'id'  => 1,
         'name' => 'Test 1',
         'classId' => 15
       ),
  2 => array(
         'id'  => 1,
         'name' => 'Test 1',
         'classId' => 17
       ),
);
$classIds = [15, 17, 3];

你可以用

// Create assoc array mapping classIds to their desired sorted position.
$classIdsOrder = array_combine($classIds, range(0, count($classIds)-1));

// Sort $arr according to the 'classId' order described by $classIdsOrder
usort($arr, function ($left, $right) use ($classIdsOrder) {
    return $classIdsOrder[$left['classId']] <=> $classIdsOrder[$right['classId']];
});

print_r($arr);

其输出

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Test 1
            [classId] => 15
        )

    [1] => Array
        (
            [id] => 1
            [name] => Test 1
            [classId] => 17
        )

    [2] => Array
        (
            [id] => 1
            [name] => Test 1
            [classId] => 3
        )

)

Try it online!

相关问题