我有两个不同的多维数组,如下:
$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'],
];
试试这个:
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]);
}
}
可能有一个更干净的解决方案,但这是我的尝试:
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);
我建议通过利用引用变量来修改第一个和第二个数组,而不是进行嵌套循环。
由于没有对第一个数组进行过滤,只需将状态元素声明为可修改,声明一个用户名键控引用以供以后使用,并将默认状态值设置为
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);