根据两个二维数组之间是否存在相关数据来修改/过滤它们

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

我有两个不同的多维数组,如下:

$first = [
    ['timestamp' => '7/10/2018 15:24:06', 'username' => 'giakhang', 'status' => null],
    ['timestamp' => '8/10/2018 5:11:25', 'username' => 'haophan', 'status' => null],
    ['timestamp' => '8/10/2018 6:38:18', 'username' => 'TTQ1504', 'status' => null],
    ['timestamp' => '08/10/2018 7:04:20', 'username' => 'btcgainer24724', 'status' => null],
];
$second = [
    ['timestamp' => '8/10/2018 5:10:06', 'username' => 'giakhang'],
    ['timestamp' => '8/10/2018 5:13:25', 'username' => 'btcgainer24724'],
    ['timestamp' => '8/10/2018 6:44:18', 'username' => 'anggie88'],
    ['timestamp' => '08/10/2018 7:55:20', 'username' => 'ZeusTrade'],
];

对于

username
1st_array
之间的每个相同的
2nd_array
,我希望将
status
1st_array
中的
unset
从两者之间不相交的
2nd_array
对象更改。

期望的结果:

$first = [
    ['timestamp' => '7/10/2018 15:24:06', 'username' => 'giakhang', 'status' => 'Yes'],
    ['timestamp' => '8/10/2018 5:11:25', 'username' => 'haophan', 'status' => 'No'],
    ['timestamp' => '8/10/2018 6:38:18', 'username' => 'TTQ1504', 'status' => 'No'],
    ['timestamp' => '08/10/2018 7:04:20', 'username' => 'btcgainer24724', 'status' => 'Yes'],
];
$second = [
    ['timestamp' => '8/10/2018 5:10:06', 'username' => 'giakhang'],
    ['timestamp' => '8/10/2018 5:13:25', 'username' => 'btcgainer24724'],
];
php arrays multidimensional-array filtering intersection
3个回答
1
投票

试试这个:

foreach ($second_array as $key => $value) {
        $exist = false;
        foreach ($first_array as $key2 => $value2) {
            if ($value['username'] == $value2['username']) {
                $exist = true;
                $first_array[$key2]['status'] = 'Yes';
                break;
            } elseif (!$first_array[$key2]['status']) {
                $first_array[$key2]['status'] = 'No';
            }
        }

        if (!$exist) {

            unset($second_array[$key]);
        }
    }

0
投票

可能有一个更干净的解决方案,但这是我的尝试:

foreach ($1stArray as $1st) {
    foreach ($2ndArray as $2nd) {
        if ($1st['username'] == $2nd['username']) 
            $1st['status'] = 'Yes';
    }
    if (!$1st['status']) {
        $1st['status'] = 'No';
        unset($2ndArray[array_search($1st['username'], $1st)]);
    }
}

// Finally, we sanitize the 2ndArray indexes
$2ndArray = array_values($2ndArray);

0
投票

我建议通过利用引用变量来修改第一个和第二个数组,而不是进行嵌套循环。

由于没有对第一个数组进行过滤,只需将状态元素声明为可修改,声明一个用户名键控引用以供以后使用,并将默认状态值设置为

No

然后循环第二个数组,并将第一个数组中的状态值更改为

Yes
或从第二个数组中删除该行。

这是一种非常干净、线性、高性能的方法。

代码:(演示

foreach ($first as ['username' => $username, 'status' => &$ref[$username]]) {
    $ref[$username] = 'No';
}

foreach ($second as $i => ['username' => $username]) {
    if (isset($ref[$username])) {
        $ref[$username] = 'Yes';
    } else {
        unset($second[$i]);
    }
}
var_dump($first, $second);
© www.soinside.com 2019 - 2024. All rights reserved.