类似于问题:根据另一个数组按键对数组进行排序? 只有我想删除任何不常见的键。
本质上,我尝试通过array_intersect_key($VARIABLES, array_flip($signature_args));
按键过滤变量,然后尝试使用array_merge(array_flip($signature_args), $filtered)
对其进行排序
如下所示:
$VARIABLES = array('3'=>'4', '4'=>'5', '1'=>'2');
$signature_args = array('1', '2', '3');
$filtered = array_intersect_key($VARIABLES, array_flip($signature_args));
var_dump($filtered);
var_dump(array_merge(array_flip($signature_args), $filtered));
生产:
array(2) {
[3]=>
string(1) "4"
[1]=>
string(1) "2"
}
array(5) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(2)
[3]=>
string(1) "4"
[4]=>
string(1) "2"
}
而不是
array(2) {
[3]=>
string(1) "4"
[1]=>
string(1) "2"
}
array(2) {
[1]=>
string(1) "2"
[3]=>
string(1) "4"
}
我所期望的,为什么?
这应该适合您:
<?php
$VARIABLES = array('3'=>'4', '4'=>'5', '1'=>'2');
$signature_args = array('2', '3', '1');
$filtered = array_intersect_key($VARIABLES, array_flip($signature_args));
var_dump($filtered);
$ordered = array();
foreach ($signature_args as $key) {
if(!empty($filtered[$key]))
$ordered[$key] = $filtered[$key] ;
}
var_dump($ordered);
?>
或者,如果你愿意,你可以使用它:
array_walk($signature_args, function($key) {
if(!empty($filtered[$key])) $ordered[$key] = $filtered[$key] ;
}, $ordered);
要使用"allow"数组不仅过滤输入数组,还对输出进行排序,请按彼此过滤两个数组,然后将输入数组替换(或合并)到允许的数组中。
代码:(演示)
$input = ['3' => '4', '4' => '5', '1' => '2'];
$allowed = ['1', '2', '3'];
$flipAllowed = array_flip($allowed);
var_export(
array_replace(
array_intersect_key($flipAllowed, $input), // filtered allowed
array_intersect_key($input, $flipAllowed) // filtered input
)
);
输出:
array (
1 => '2',
3 => '4',
)