PHP - 按另一个数组排序多维数组

Meg*_*Hit 8 php sorting multidimensional-array

我正在尝试用另一个数组对一个多维数组进行排序,但到目前为止还很短.
array_multisort似乎只适用于真正的排序.

假设我有这两个数组:

$order = array(2,3,1);

$data = array(
    array('id' => 1, 'title' => 'whatever'),
    array('id' => 2, 'title' => 'whatever'),
    array('id' => 3, 'title' => 'whatever')
);
Run Code Online (Sandbox Code Playgroud)

现在我想$data根据数组中的顺序对数组进行排序$order.
这就是我想要的结果:

$data = array(
    array('id' => 2, 'title' => 'whatever'),
    array('id' => 3, 'title' => 'whatever')
    array('id' => 1, 'title' => 'whatever'),
);
Run Code Online (Sandbox Code Playgroud)

我可以通过运行嵌套循环轻松完成此任务,但这不能很好地扩展(我的数组非常大,并且数组有更多字段).

Jan*_*enk 7

在您的示例中,$ data数组中的ID是连续编号的,从1开始.我在下面给出的代码假设始终如此.如果不是这种情况,则代码不起作用.

$result = array();
$index = 0;
foreach ($order as $position) {
    $result[$index] = $data[$position - 1];
    $index++;
}
Run Code Online (Sandbox Code Playgroud)

http://codepad.org/YC8w0yHh,您可以看到它适用于您的示例数据.

编辑

如果上述假设不成立,则以下代码将获得相同的结果:

<?php

$data = array(
    array('id' => 1, 'title' => 'whatever'),
    array('id' => 2, 'title' => 'whatever'),
    array('id' => 3, 'title' => 'whatever')
);

$order = array(2,3,1);
$order = array_flip($order);

function cmp($a, $b)
{
    global $order;

    $posA = $order[$a['id']];
    $posB = $order[$b['id']];

    if ($posA == $posB) {
        return 0;
    }
    return ($posA < $posB) ? -1 : 1;
}

usort($data, 'cmp');

var_dump($data);
Run Code Online (Sandbox Code Playgroud)

有关证据,请参见http://codepad.org/Q7EcTSfs.

通过在$ order数组上调用array_flip(),它可以用于位置查找.这类似于哈希表查找,它在时间上是线性的,或者是O(n).你不能做得更好.


Vla*_*mir 6

对于那些想要根据具有实际 ID 的数组而不是像已接受的答案中那样基于具有索引的数组对数据进行排序的人,您可以使用以下简单的比较函数usort

usort($data, function($a, $b) use ($order) {
    $posA = array_search($a['id'], $order);
    $posB = array_search($b['id'], $order);
    return $posA - $posB;
});
Run Code Online (Sandbox Code Playgroud)

因此,以下示例将正常工作,您将不会收到Undefined offset通知和包含值的数组null

$order = [20, 30, 10];

$data = [
    ['id' => 10, 'title' => 'Title 1'],
    ['id' => 20, 'title' => 'Title 2'],
    ['id' => 30, 'title' => 'Title 3']
];

usort($data, function($a, $b) use ($order) {
    $posA = array_search($a['id'], $order);
    $posB = array_search($b['id'], $order);
    return $posA - $posB;
});

echo '<pre>', var_dump($data), '</pre>';
Run Code Online (Sandbox Code Playgroud)

输出:

array(3) {
  [0]=>
  array(2) {
    ["id"]=>
    int(20)
    ["title"]=>
    string(7) "Title 2"
  }
  [1]=>
  array(2) {
    ["id"]=>
    int(30)
    ["title"]=>
    string(7) "Title 3"
  }
  [2]=>
  array(2) {
    ["id"]=>
    int(10)
    ["title"]=>
    string(7) "Title 1"
  }
}
Run Code Online (Sandbox Code Playgroud)


aur*_*ora 5

PHP中没有为此内置的函数,我无法想到任何自定义函数,可以使用usort做到这一点。但是imo,array_map非常简单,那么为什么不使用它呢?

$sorted = array_map(function($v) use ($data) {
    return $data[$v - 1];
}, $order);
Run Code Online (Sandbox Code Playgroud)