对二维数组的所有行进行排序,以与特定行的排序结果对齐

问题描述 投票:0回答:3
$arr = [
    'content_type' => ['story', 'delhi', 'tez'],
    'type' => ['video_id', 'subcategory', 'story_id'],
    'fetch_id' => [32, 32, 2],
    'order' => [6, 4, 5],
    'label' => ['dsfs fdsf dsf sdf', 'dfsdfs', 'sdfsdfsd'],
    'link' => ['fsd fsdf sdf', 'fsdfsdfdsf', 'fsdfdsfds'],
    'record' => [10, 8, 12]
];

上面是数组,我必须根据订单字段对该数组进行排序,并且它还应该相应地对所有其他字段进行排序,如下例所示。

$arr['order'][0] = 4;
$arr['order'][1] = 5;
$arr['order'][2] = 6;

$arr['type'][0] = 'subcategory';
$arr['type'][1] = 'story_id';
$arr['type'][2] = 'video_id';

等等......

php arrays sorting multidimensional-array array-multisort
3个回答
0
投票

你可以试试这个 -

$new = array();
// Extract and get the keys as values
$order = array_flip($array['order']);
// sort them according to keys
ksort($order);
// loop through main array
foreach($array as $key => $sub_array) {
  // loop through order
  foreach ($order as $o) {
    // store the new value according to order
    $new[$key][] = $sub_array[$o];
  }
}

演示


0
投票

一些较小的解决方案:

asort($array['order']);
foreach ($array as $key => $subArray) {
    $array[$key] = array_replace($array['order'], $subArray);
}

要重置按键序列,您可以只使用 array_values()。


0
投票

因为关联数组要按没有重复值的列进行排序,所以

array_multisort()
将是最直接的方法。

将数组的每个元素硬编码为函数参数将命令函数按参数位置排序。 换句话说,要首先按

order
值排序,将该元素定位为第一个参数。 演示

array_multisort(
    $array['order'],
    $array['content_type'],
    $array['type'],
    $array['fetch_id'],
    $array['label'],
    $array['link'],
    $array['record']
);
var_export($array);

对于动态排序,可以使用展开运算符 (

...
) 将数组解包为参数。 然而,这个关联数组是不兼容的——解压缩的数组必须有ununric键。 要设置传播并通过引用进行修改,请使用循环生成引用的索引数组,然后将其解压。该引用数组必须在前面添加对
order
的引用,以便首先由其值决定排序。 演示

$params[] = $array['order'];
foreach ($array as &$params[]);
array_multisort(...$params);

var_export($array);

在上面的代码片段中,params 数组的第一个元素不需要是引用,因为循环无论如何都会为

order
元素创建引用。

如果数组要按元素的原始顺序排序,则不需要在循环之前推送元素。


如 @timurib 所示,对

order
子数组进行排序并保留键设置能够使用
array_replace()
array_merge()
(但不能使用数组并集运算符)更新每个元素的顺序。这是使用函数迭代的实现。 演示

asort($array['order']);
var_export(
    array_map(
        fn($row) => array_replace(
            $array['order'],
            $row
        ),
        $array
    )
);

这种方法非常受控,但由于迭代函数调用的开销,性能可能最差。

© www.soinside.com 2019 - 2024. All rights reserved.