Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP仅从多维数组中获取值,其中键与其他数组相交_Php - Fatal编程技术网

PHP仅从多维数组中获取值,其中键与其他数组相交

PHP仅从多维数组中获取值,其中键与其他数组相交,php,Php,我想这应该很简单,但我找不到办法 我有两个数组,一个带有颜色和ID $color_ids = [ 'green' => [1,2,3], 'blue' => [4,5], 'red' => [6], 'pink' => [7,8,9], 'yellow' => [10] ]; 以及其他具有选择的 $select = ['green', 'red', 'yellow']; 然后我需要id,其中$color\u id和$select之间的键相交。这应该是结

我想这应该很简单,但我找不到办法

我有两个数组,一个带有
颜色
ID

$color_ids = [
 'green' => [1,2,3],
 'blue' => [4,5],
 'red' => [6],
 'pink' => [7,8,9],
 'yellow' => [10]
];
以及其他具有
选择的

$select = ['green', 'red', 'yellow'];
然后我需要
id
,其中
$color\u id
$select
之间的键相交。这应该是结果(一个简单的线性阵列):

我试过这个:

$result=array\u值(array\u intersect\u键($color\u id,array\u flip($select))

但我得到了多维数组:

array(3) { 
   [0]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 
   [1]=> array(1) { [0]=> int(6) } 
   [2]=> array(1) { [0]=> int(10) }
}
我得到了与此相同的结果:

$result = [];
foreach ($select as $key) {            
  if (isset($color_ids[$key]))
    $result[] = $color_ids[$key];              
}   

如何获得具有ID的简单线性阵列?

您可以使用
阵列_merge
操作符,这是一种常见的展平技术

文件

文档。

1)迭代密钥数组

2) 使用
array\u Merge

 $select = ['green', 'red', 'yellow'];
 $finalArray=[];
   foreach($select as $value){
     $finalArray= array_merge($finalArray,$color_ids[$value]);
   }
 echo "<pre>";
 print_r($finalArray);
用foreach

var_export(
    array_merge(
        ...array_values(
            array_intersect_key(
                $color_ids,
                array_flip($select)
            )
        )
    )
);

如果您正在寻找一个完全“功能型”的解决方案,这里有一个

  • 设置筛选数组(
    $select
    ),使其具有与主数组的键类似的键。换句话说,将值翻转为关键点
  • 然后使用
    array\u intersect\u key()
    快速过滤主数组
  • 然后,要展平剩余的数据,请在splat/spread运算符前面加上前缀,并调用
    array\u merge()
在使用允许排列关联数组的php版本之前,您需要调用
array\u values()
来重新索引第一级键,以便排列操作符不会阻塞

代码:()

或者,如果您喜欢将语法混在一行中:

$result = [];
foreach ($select as $color) {
    array_push($result, ...$color_ids[$color]);
}    
var_export($result);
尽管
foreach()
的执行速度可能比函数式编程快几纳秒,但您永远不会注意到这样小的数据集。这种编码风格的一个好处是,您不必命名任何临时变量来将符合条件的数据推入。换句话说,您可以将其直接输入函数内部的
return
语句中,我发现它非常整洁


或者,如果您不介意生成一个结果变量,那么迭代
array\u push()
调用,同时传播匹配的指定颜色\u id值非常简单。这种技术的不同之处在于,如果
$select
中包含的颜色不是
$color\u id
中的键,那么php会对您咆哮

代码:()

这两种技术提供相同的结果

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 6
    [4] => 10
)
$result = [];
foreach($color_ids as $color => $ids){
  $result = array_merge($result, in_array($color, $select) ? $ids : []);
}
var_export(
    array_merge(
        ...array_values(
            array_intersect_key(
                $color_ids,
                array_flip($select)
            )
        )
    )
);
var_export(array_merge(...array_values(array_intersect_key($color_ids, array_flip($select)))));
$result = [];
foreach ($select as $color) {
    array_push($result, ...$color_ids[$color]);
}    
var_export($result);