PHP сравнить 2 разных массива по значению и найти различия - PullRequest
0 голосов
/ 06 августа 2020

У меня есть 2 совершенно разных массива:

1 выглядит так ($ fromBackend):

array:3 [
  114466 => array:1 [
    "BrandID" => 136,
    "record" => 114466
  ]
  114467 => array:1 [
    "BrandID" => 1,
    "record" => 114467
  ]
  114468 => array:1 [
    "BrandID" => 2,
    "record" => 114468
  ]
]

Другой выглядит так ($ fromFrontend):

array:2 [
  0 => Entity {#920
    #id: 117
    #brandId: 1
  }
  1 => Entity {#915
    #id: 118
    #brandId: 2
  }
]

Теперь, как вы можете видеть, мне нужно найти "запись" первого массива, где brandId не совпадает, поэтому в этом случае мне нужно найти "114466", потому что BrandId => 136 не существует во втором array

Вот что у меня есть:

$recordsToDelete = [];
foreach ($fromBackend as $fromBackendItem) {
    foreach ($fromFrontend as $fromFrontendItem) {
        if ($fromBackendItem['BrandID'] !== $brand->getBrandId()) {
            $recordsToDelete[] = $fromBackendItem['record'];
        }
    }
 }

 dd($recordsToDelete);

Это дает мне странные результаты, вероятно, из-за того, что я слишком много зацикливаю:

0 => 114466
1 => 114466
2 => 114467
3 => 114468

1 Ответ

2 голосов
/ 06 августа 2020

Вы добавляете каждую запись в свой массив $recordsToDelete, потому что каждый раз, когда значения brandId не совпадают, вы добавляете запись и, поскольку значения brandId не совпадают для all записей, это означает, что условие всегда выполняется хотя бы один раз для каждой записи. Вместо этого сравните все значения brandId из внешнего интерфейса для каждой внутренней записи и только добавьте запись в $recordsToDelete, если она не соответствует любому другому brandId стоимость. Например:

$recordsToDelete = array();
foreach ($fromBackend as $backendItem) {
    foreach ($fromFrontEnd as $frontendItem) {
        if ($frontendItem->brandId == $backendItem['BrandID']) break;
    }
    if ($frontendItem->brandId != $backendItem['BrandID']) $recordsToDelete[] = $backendItem['record'];
}
print_r($recordsToDelete);

Вывод (для ваших демонстрационных данных):

Array
(
    [0] => 114466
)

Демо на 3v4l.org

Если $fromFrontEnd может быть пустым, приведенный выше код вызовет ошибку неопределенной переменной. Вы можете обойти это, проверив его с помощью оператора объединения NULL, например

if (($frontendItem->brandId ?? -1) != $backendItem['BrandID']) $recordsToDelete[] = $backendItem['record'];

или используя явный флаг found:

foreach ($fromBackend as $backendItem) {
    $found = false;
    foreach ($fromFrontEnd as $frontendItem) {
        if ($frontendItem->brandId == $backendItem['BrandID']) {
            $found = true;
            break;
        }
    }
    if (!$found) $recordsToDelete[] = $backendItem['record'];
}

, хотя, вероятно, было бы проще просто не выполнять внешний foreach l oop, если только !empty($fromFrontEnd);

Демонстрация двух вышеуказанных решений на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...