基于另一个数组按键对数组进行相交和排序


Intersect and Sort an Array by keys based on another Array?

类似于问题:根据另一个数组按键对数组进行排序? 只有我想删除任何不常见的键。

本质上,我尝试通过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',
)