Может ли in_array () сравниваться с первым значением всех массивов второго уровня двумерного массива? - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь найти более простое решение для этой конкретной ситуации:

  1. У меня есть одномерный массив ($array1) без ключей, содержащий около 400 значений (строк)
  2. Затем я получаю данные из базы данных (используя подготовленный оператор) по 4 значения в строке, которые я использую для создания двумерного массива ($array2a), который мне понадобится позже.
  3. Сейчас Я хочу сравнить значения $array1 со значениями в первой строке $array2a: я хочу создать список всех значений $array1, которые не в первой строке база данных (поле «имя пользователя»).

Я нашел рабочее решение, но оно кажется слишком сложным - на шаге 2 используются два разных массива, один из которых содержит только строки по сравнению с массивом1, другое содержит все 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>";
    }
}

Это дает мне список всех значений $array1, которые не в столбце username базы данных. Однако во второй части (foreach l oop) я хотел бы использовать $array2a вместо $array2b, но я не знаю, как применить функцию in_array() только к каждому первому значению массивов второго уровня $array2a. Я пытался использовать if(!in_array($x, $array2a[0])) { ... }, но это, конечно, не работает ...

1 Ответ

1 голос
/ 04 февраля 2020

Вы можете использовать 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
)
*/
...