根据二维数组中的行数据重新映射平面数组的值

问题描述 投票:0回答:3

假设我有两个数组:

$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'] : '';
}

它没有按我的预期工作。我怎样才能实现这个目标?

php arrays multidimensional-array lookup remap
3个回答
1
投票

考虑到您的

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']  : '';
}

1
投票

您应该避免对二维数组进行迭代扫描;这不是高效的编程。

而是将二维数组转换为一维查找数组,并通过进行基于键的值查找来享受最佳性能。如果 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,
)

0
投票

只是为了表明有不止一种方法可以做到这一点:

$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
非常有用。虽然本例中的匹配非常简单。

© www.soinside.com 2019 - 2024. All rights reserved.