php 根据同一数组中的其他行替换二维数组中每行的列值

1l5u6lss  于 2022-11-28  发布在  PHP
关注(0)|答案(2)|浏览(124)

我有一个这样的数组:

$array = [
    ['record' => 1, 'sponsor' => 2, 'email' => 'some@email.com'],
    ['record' => 2, 'sponsor' => 2, 'email' => 'some1@email.com'],
    ['record' => 3, 'sponsor' => 2, 'email' => 'some2@email.com'],
    ['record' => 4, 'sponsor' => 2, 'email' => 'some3@email.com'],
];

每一行都有一个唯一的recordemail,而sponsor键与record相关。因此,我尝试将sponsor键的值替换为基于record的对应email,而不是整数,如下所示:

$array = [
    ['record' => 1, 'sponsor' => 'some1@email.com', 'email' => 'some@email.com'],
    ['record' => 2, 'sponsor' => 'some1@email.com', 'email' => 'some1@email.com'],
    ['record' => 3, 'sponsor' => 'some1@email.com', 'email' => 'some2@email.com'],
    ['record' => 4, 'sponsor' => 'some1@email.com', 'email' => 'some3@email.com'],
];

我尝试过使用foreach循环,但没有给予预期的结果:

$yes = [];
foreach ($array as $key => $arr) {
    if ( ! empty($arr['sponsor']) ) {
        if ( $arr['sponsor'] == $array[$key]['record'] ) {
            $yes[] = ['sponsor' => $array[$key]['email']];
        }
    }
    $yes[] = [
        'record' => $array[$key]['record'], 
        'email' => $array[$key]['email'],
        'sponsor' => $array[$key]['sponsor'],
    ];
}
print_r($yes);
tf7tbtn2

tf7tbtn21#

由于record是唯一的,我建议使用这个值作为键来重建$arr

$indexedArray = [];
foreach ($array as $v) {
  $indexedArray[$v['record']] = $v;
}   
foreach ($indexedArray as $record => $v) {
  if (isset($indexedArray[$v['sponsor']]) && isset($indexedArray[$v['sponsor']]['email'])) {
    $indexedArray[$record]['sponsor'] = $indexedArray[$v['sponsor']]['email'];
  }
}
$yes = array_values($indexedArray);
4xy9mtcn

4xy9mtcn2#

创建一个查找数组,将record值作为键,将email值作为值,然后根据相应的查找值覆盖每行中的主办方值。
代码:(Demo

$lookup = array_column($array, 'email', 'record');
var_export(
    array_map(fn($row) => array_replace($row, ['sponsor' => $lookup[$row['sponsor']]]), $array)
);

或者搭配经典循环:(Demo

$lookup = array_column($array, 'email', 'record');
foreach ($array as &$row) {
    $row['sponsor'] = $lookup[$row['sponsor']];
}
var_export($array);

如果在查找中可能找不到给定的sponsor值,则在尝试访问查找数组时使用$lookup[$row['sponsor']] ?? 'some fallback'。这样就不会生成警告/错误。这是检查isset()的一种更简洁的方法。
请记住,在这种情况下使用the array union operator won't work properly

相关问题