$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';
等等......
你可以试试这个 -
$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];
}
}
一些较小的解决方案:
asort($array['order']);
foreach ($array as $key => $subArray) {
$array[$key] = array_replace($array['order'], $subArray);
}
要重置按键序列,您可以只使用 array_values()。
因为关联数组要按没有重复值的列进行排序,所以
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
)
);
这种方法非常受控,但由于迭代函数调用的开销,性能可能最差。