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);