PHP Как исключить элементы из массива и вывести их

Я хотел бы вывести в результате 235. То есть из одного массива взять значение, сравнить его с другим, если они не равны вывести значение из 1 массива, но у меня почему то выводит все элементы из 1 массива. PHP:

<?php
$give_lvl =
  array(
    0 => array(
      'lvl' => 1,
      'exp' => 1000
    ),
    1 => array(
      'lvl' => 2,
      'exp' => 1100
    ),
    2 => array(
      'lvl' => 3,
      'exp' => 1200
    ),
    3 => array(
      'lvl' => 4,
      'exp' => 1300
    ),
    4 => array(
      'lvl' => 5,
      'exp' => 1400
    ),
  );
$have_lvl = array(
  0 => array(
    'lvl' => 1,
    'exp' => 1000
  ),
  1 => array(
    'lvl' => 4,
    'exp' => 1100
  ),
);
foreach ($give_lvl as $key => $give) {
  foreach ($have_lvl as $key => $have) {
    if ($give['lvl'] != $have['lvl']) {
      echo $give['lvl'];
      break;
    }
  }
}

Ответы (1 шт):

Автор решения: Максим Степанов

Так как массив $have_lvl имеет два разных значения lvl, ваша проверка всегда будет совпадать во внутреннем цикле и, соответственно, выведутся все значения из первого массива.

Чтобы это исправить, Вы можете добавить флаг в вашу проверку, и после прохода внутреннего цикла по флагу определять, выводить что-то или нет:

foreach ($give_lvl as $give) {
    $inHave = false;
    foreach ($have_lvl as $have) {
        if ($give['lvl'] === $have['lvl']) {
            $inHave = true;
        }
    }
    if (!$inHave) {
        echo $give['lvl'];
    }
}

Или воспользоваться какой-нибудь более удобной функцией и заодно сохранить массив измененный, например, array_filter:

$result = array_filter($give_lvl, function ($x) use ($have_lvl) {
    foreach ($have_lvl as $y) {
        if ($x['lvl'] === $y['lvl']) {
            return false;
        }
    }
    echo $x['lvl'];
    return true;
});
→ Ссылка