Как удалить массив из массива, сравнивая его с другим массивом? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть 2 массива, как показано ниже. Один массив - это двумерный массив ($array_1), а другой - простой массив ($array_2). Это $array_1 как ключ, называемый private_name в каждом массиве, а $array_2 имеет список значений private_key. Я хочу сохранить массив из $array_1, который соответствует $array_2.

    $array_1 = [
        [0] => ['id'=>12, 'private_name' => 'name12', 'age' => '23'],
        [1] => ['id'=>2, 'private_name' => 'name2', 'age' => '23'],
        [2] => ['id'=>9, 'private_name' => 'name1', 'age' => '23'],
        [3] => ['id'=>11, 'private_name' => 'name11', 'age' => '23'],
        .
        .
        .
        [999] => ['id'=>999, 'private_name' => 'name999', 'age' => '23'],
   ];

   $array_2 = ['name1', 'name2', 'name3',....];

Итак, я хочу удалить содержимое массива из $array_1, что соответствует $array_2. В настоящее время я использую метод ниже, но это занимает много времени, поскольку в $array_1 есть значения массива 14k +. Есть ли какое-либо решение для этого, которое просто использует 1 строку для решения вышеизложенного. Я хочу такое решение, как

$newVal = array_intersect(array_column($array_1, 'private_name'), $array_2);

В настоящее время я делаю как ниже, что занимает много времени

$results = array();
    $count = 0;
    if (count($array_1) > 0) {
        foreach ($array_1 as $row) {
            foreach ($row as $col => $val) {
                foreach ($array_2 as $key3 => $pvt_name) {

                    if (strcmp($row['private_name'], $array_1) == 0) {

                        $results[$count][$col] = $val;

                    }
                }
            }
            $count++;
        }
    }

Любая помощь очень ценится. Спасибо

1 Ответ

0 голосов
/ 17 апреля 2020

Это легко сделать, используя array_filter.

$filtered_array = array_filter($array_1, function($item) use($array_2) {
  return !in_array($item['private_name'], $array_2);
});
var_dump($filtered_array);

Функция обратного вызова должна возвращать true, чтобы сохранить элемент в результате, false для его отмены. Это делается здесь, проверяя, содержится ли значение private_name элемента во втором массиве - и результат этого отрицается, потому что вы хотите оставить только те, которые не соответствуют.

...