首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP - 按另一个数组排序多维数组

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

Stack Overflow用户
提问于 2018-09-29 03:26:11
回答 2查看 0关注 0票数 0

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

假设我有这两个数组:

代码语言:javascript
复制
$order = array(2,3,1);

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

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

代码语言:javascript
复制
$data = array(
    array('id' => 2, 'title' => 'whatever'),
    array('id' => 3, 'title' => 'whatever')
    array('id' => 1, 'title' => 'whatever'),
);

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

EN

回答 2

Stack Overflow用户

发布于 2018-09-29 12:01:10

在PHP中没有内置函数,我无法想到任何自定义函数,这将使用usort执行此操作。但是array_map很简单,imo,那么为什么不使用呢?

代码语言:javascript
复制
$sorted = array_map(function($v) use ($data) {
    return $data[$v - 1];
}, $order);
票数 0
EN

Stack Overflow用户

发布于 2018-09-29 13:10:58

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

代码语言:javascript
复制
$result = array();
$index = 0;
foreach ($order as $position) {
    $result[$index] = $data[$position - 1];
    $index++;
}

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

编辑

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

代码语言:javascript
复制
<?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);

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100002804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档