php按自定义顺序对多维数组进行排序

标签 php arrays sorting multidimensional-array

<分区>

按其中一个键值(asc 或 desc)对多维数组进行排序被询问了太多次。 但我还没有找到解决我的问题的任何解决方案,您必须按照预定义的自定义顺序按其键值之一对多维数组进行排序。

以数组为例

$array[0] = array('id'=> '111', value=>'abc');
$array[1] = array('id'=> '100', value=>'abc');
$array[2] = array('id'=> '132', value=>'abc');
$array[3] = array('id'=> '222', value=>'abc');
$array[4] = array('id'=> '112', value=>'abc');
$array[5] = array('id'=> '200', value=>'abc');

并按照下面数组中定义的顺序按子键“id”对该数组进行排序:

$sort_order_id = array('112','111','132','100');

所以结果是

$array[0] = array('id'=> '112', value=>'abc');
$array[1] = array('id'=> '111', value=>'abc');
$array[2] = array('id'=> '132', value=>'abc');
$array[3] = array('id'=> '100', value=>'abc');
$array[4] = array('id'=> '222', value=>'abc');
$array[5] = array('id'=> '200', value=>'abc');

注意:如果某些 id 在 $sort_order_id 数组中不可用,请将它们放在最后(如上例中的 id 222 和 200 不在 $sort_order_id 数组中,因此它按照它们之前的顺序排在最后序)

我尝试了很多但无法为此创建算法...我希望有人能帮助我...

最佳答案

采用按id对数组进行排序的标准代码:

usort($data, function($x, $y) { return $x['id'] - $y['id']; });

您要做的不是按 ID 本身排序,而是按每个 ID 的“权重”(表示您希望 ID 放入的任意顺序)。因此,创建一个数组,其中键是 id,值是权重,并使用它将 id 转换为权重:

// array_flip turns 0 => 112, 1 => 111, ... into 122 => 0, 111 => 1, ...
$weights = array_flip(array('112','111','132','100'));

usort($data, function($x, $y) use($weights) {
    return $weights[$x['id']] - $weights[$y['id']];
});

更新:由于您还想处理没有指定权重的 ID,因此您必须进一步扩展上述内容:

usort($data, function($x, $y) use($weights) {
    if (!isset($weights[$x['id']], $weights[$y['id']])) {
        // none of the ids have weight, so sort by bare id
        return $x['id'] - $y['id'];
    }
    else if (!isset($weights[$x['id']])) { 
        // x does not have weight, put it last
        return 1;
    }
    else if (!isset($weights[$y['id']])) {
        // y does not have weight, put it last
        return -1;
    }

    // both have weights, use them
    return $weights[$x['id']] - $weights[$y['id']];
});

关于php按自定义顺序对多维数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22094589/

相关文章:

php - 判断一个php进程的Linux用户

python - 更改 Array 元素时在 Python traits 包中触发事件

c - 如何找到分隔数组中元素的常量值

javascript - JS sort() 在嵌套对象上无法按预期工作

php - Hook 到 Wordpress 图片上传

php - 从mysql绘制数据

javascript - 我有很多相同类别的 div,我想展示它们。这个 div 在一个 div 里面,所以就像一个工具提示

python - 使用 numpy 索引元组

java - Displaytag 对我的表格进行排序,但仅在第一页

c++ - 创建多个结构然后按元素排序