假设我有两个数组:
$array1 = ['A', 'B', 'C', 'D'];
$array2 = [
['name' => 'B', 'number' => 10],
['name' => 'D', 'number' => 20]
];
我想将
$array1
与 $array2
的 name
列进行比较。如果 $array1
的值与 $array2'
的 name
列匹配,则将打印相应的 number
列值,否则留空。
所需输出:
$array3 = ['','10','','20'];
我尝试过这样的:
$array3 = [];
foreach ($array1 as $key => $value) {
$array3[$key] = (in_array($value, array_column($array2 , 'name'))) ? array2[$key]['number'] : '';
}
它没有按我的预期工作。我怎样才能实现这个目标?
考虑到您的
array2[$key]['number']
从 0 到 3,但 array2 在键 0 和 1 下只有 has元素,
$key
应该如何有意义?
另外,变量名前缺少 $ 符号 - 启用正确的 PHP 错误报告,以便 PHP 可以告诉您此类错误!
使用
array_search
而不是 in_array
,这样你就可以得到 $array2 中找到的元素的 key。
foreach($array1 as $key=>$value){
$array2key = array_search($value,array_column($array2 , 'name'));
$array3[] = $array2key !== false ? $array2[$array2key]['number'] : '';
}
您应该避免对二维数组进行迭代扫描;这不是高效的编程。
而是将二维数组转换为一维查找数组,并通过进行基于键的值查找来享受最佳性能。如果 array1 值在查找中不作为键存在,则在重新映射时默认为空字符串。
代码:(演示)
$array1 = ['A', 'B', 'C', 'D'];
$array2 = [
['name' => 'B', 'number' => 10],
['name' => 'D', 'number' => 20]
];
$lookup = array_column($array2, 'number', 'name');
var_export(array_map(fn($v) => $lookup[$v] ?? '', $array1));
输出:
array (
0 => '',
1 => 10,
2 => '',
3 => 20,
)
只是为了表明有不止一种方法可以做到这一点:
$array1 = ['A','B','C','D'];
$array2 = [
0=>[
'name' => 'B',
'number' => 10
],
1=>[
'name' => 'D',
'number' => 20
]
];
$array3 = [];
foreach ($array1 as $letter) {
$matches = array_filter($array2, function ($element) use ($letter) {return $element['name']==$letter;});
if (count($matches)>0) {
$array3[] = array_values($matches)[0]['number'];
} else {
$array3[] = '';
}
}
print_r($array3);
如果您想返回匹配某些(复杂)条件的元素,尤其是在有数组数组的情况下,array_filter
非常有用。虽然本例中的匹配非常简单。