我正在尝试为这种特殊情况找到更简单的解决方案:
- 我有一个没有键的一维数组(
$array1
(,包含大约 400 个值(字符串( - 然后我从数据库中获取数据(使用预准备语句(,每行 4 个值,我用它来创建一个二维数组 (
$array2a
(,稍后需要。 - 现在我想将
$array1
的值与$array2a
第一行中的值进行比较:我想创建一个列表,其中包含不在数据库第一行(字段"用户名"(的$array1
的所有值。
我找到了一个有效的解决方案,但它似乎有点太复杂了 - 它在步骤 #2 中使用了两个不同的数组,一个只包含要与 array1 比较的字符串,另一个包含从数据库中获取的所有 4 个值,我稍后需要:
/* $array1 exists already */
$array2a = array();
$array2b = array();
/* "$db" already contains the code for the database connection */
if($ps = $db->prepare("SELECT username, value2, value3, value4 FROM userlist")) {
$ps->execute();
$ps->bind_result($username, $value2, $value3, $value4);
while($ps->fetch()) {
$array2a[] = array($username, $value2, $value3, $value4);
$array2b[] = $username;
}
$ps->free_result();
}
$db->close;
/* comparison of $array1 to $array2b: */
foreach($array1 as $x) {
if(!in_array($x, $array2b)) {
echo $x."<br>";
}
}
这为我提供了不在数据库username
列中的所有$array1
值的列表。但是,在第二部分(foreach
循环(中,我想使用$array2a
而不是$array2b
,但我不知道如何将in_array()
函数仅应用于$array2a
的二级数组的每个第一值。我尝试使用if(!in_array($x, $array2a[0])) { ... }
,但这当然不起作用...
您可以使用array_column()
快速获取数据库返回的所有用户名的列表。然后,按照@FelippeDuarte的建议,您可以使用array_diff()
快速从数据库结果中不在$array1
中获取所有用户名:
// example data set
$array1 = ['bob', 'john', 'mary', 'elizabeth'];
$array2a = [
['bob', 2, 3, 4],
['mary', 2, 3, 4]
];
$usernamesFromDatabase = array_column($array2a, 0); // ['bob', 'mary']
$usernamesNotInDatabase = array_diff($array1, $usernamesFromDatabase);
print_r($usernamesNotInDatabase);
/*
Array
(
[1] => john
[3] => elizabeth
)
*/
请注意,来自$array1
的数组索引使用array_diff()
保存。如果这是一个问题,您可以使用array_values()
重置索引:
$resetIndices = array_values($usernamesNotInDatabase);
print_r($resetIndices);
/*
Array
(
[0] => john
[1] => elizabeth
)
*/