in_array() 可以与二维数组的所有二级数组的第一个值进行比较吗?



我正在尝试为这种特殊情况找到更简单的解决方案:

  1. 我有一个没有键的一维数组($array1(,包含大约 400 个值(字符串(
  2. 然后我从数据库中获取数据(使用预准备语句(,每行 4 个值,我用它来创建一个二维数组 ($array2a(,稍后需要。
  3. 现在我想将$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
)
*/

最新更新