rol*_*ger 1 php arrays sorting multidimensional-array custom-sort
我有两个多维数组,需要根据不同的键以与第二个数组相同的顺序对第一个数组进行排序(但它们的值相同)。在下面的示例中,我需要按照与 的值相同$allOptions的顺序进行排序。$regOptionsclID == optID
但是,并非所有$allOptions子数组 (clID) 都存在于$regOptions子数组 (optID) 中......因此,其中任何不匹配的元素都$allOptions将被扔到数组的底部/末尾。
我怎样才能做到这一点?
$allOptions = array(
array("clID"=> 171, ...other values),
array("clID"=> 191, ...other values),
array("clID"=> 131, ...other values),
array("clID"=> 101, ...other values),
array("clID"=> 201, ...other values),
array("clID"=> 181, ...other values),
...
array("clID"=> 99, ...other values), // not in regOptions
array("clID"=> 129, ...other values) // not in regOptions
array("clID"=> 139, ...other values)
) ;
$regOptions = array(
array("order"=>1,"optID"=> 131, ...other values),
array("order"=>2,"optID"=> 191, ...other values),
array("order"=>3,"optID"=> 181, ...other values),
array("order"=>4,"optID"=> 139, ...other values),
array("order"=>5,"optID"=> 101, ...other values),
array("order"=>6,"optID"=> 201, ...other values),
array("order"=>7,"optID"=> 171, ...other values)
...
) ;
Run Code Online (Sandbox Code Playgroud)
所以输出将是:
$allOptions = array(
array("clID"=> 131, ...other values),
array("clID"=> 191, ...other values),
array("clID"=> 181, ...other values),
array("clID"=> 139, ...other values)
array("clID"=> 101, ...other values),
array("clID"=> 201, ...other values),
array("clID"=> 171, ...other values),
...
array("clID"=> 99, ...other values), // not in regOptions
array("clID"=> 129, ...other values) // not in regOptions
) ;
Run Code Online (Sandbox Code Playgroud)
所有之前发布的答案都太辛苦了。用于array_column()生成查找数组。使用usort()或array_multisort()按该优先级数组排序。
代码:(演示)
$priority = array_column($regOptions, 'order', 'optID');
usort(
$allOptions,
fn($a, $b) => ($priority[$a['clID']] ?? PHP_INT_MAX) <=> ($priority[$b['clID']] ?? PHP_INT_MAX)
);
var_export($allOptions);
Run Code Online (Sandbox Code Playgroud)
如果您想对所有未提及的 clId 值回退到按 clID ASC 排序,则使用 elvis 运算符通过对列值进行简单的三向比较来打破这些联系。
$priority = array_column($regOptions, 'order', 'optID');
usort(
$allOptions,
fn($a, $b) =>
($priority[$a['clID']] ?? PHP_INT_MAX) <=> ($priority[$b['clID']] ?? PHP_INT_MAX)
?: $a['clID'] <=> $b['clID']
);
Run Code Online (Sandbox Code Playgroud)
array_multisort()第一个脚本可以通过以下方式执行。请注意,这种方法可能会表现得更好,usort()因为它进行的查找次数更少,但它确实对 进行排序,然后对行长度$priority进行排序,然后(如果您调用 ,它将如何工作;但我想所有行都具有相同的长度)。(演示)$allOptionsclIdsort($allOptions)
$priority = array_column($regOptions, 'order', 'optID');
array_multisort(
array_map(fn($v) => $priority[$v['clID']] ?? PHP_INT_MAX, $allOptions),
$allOptions
);
var_export($allOptions);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |