@Beeshop87

Объясните почему такое странное поведение foreach() и in_array() в PHP?

Приветствую! Я новобранец в рядах бэкендеров. Столкнулся с непонятным для меня явлением при работе с массивами.
1. Есть массив товаров корзины. У каждого товара свои ID магазинов самовывоза.
2.Также есть массив ID магазинов из которых возможен самовывоз.
Необходимо проверить у всех ли товаров имеется возможность самовывоза, и если да, то выяснить в какой магазин( ы ) из доступных( второй массив ) оформить самовывоз.

вот массив из товаров и ID магазинов, в котором он в наличии:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(2) "28"
    [1]=>
    string(2) "29"
  }
  [1]=>
  array(2) {
    [0]=>
    string(2) "28"
    [1]=>
    string(2) "29"
  }
  [2]=>
  array(1) {
    [0]=>
    string(2) "29"
  }
}


Вот массив с пунктами самовывоза:

array(2) {
  [0]=>
  string(2) "28"
  [1]=>
  string(2) "29"
}


Мой код, который почему-то работает))

// если в массиве товаров нет магазинов, то пустая строка

        foreach( $productAr as $product ) {

            if (!isset($product["STORES"]) ){
                $inStores[] = '';
            } else {

                $inStores[] = $product["STORES"];

            }
        }

        // есть ли у товаров магазины

        if( !empty($inStores) ) {
            $i = 0;
            $s = 0;
            foreach ($inStores as $item) {
                if (empty($item[$i])) {
                    break;
                }

                // какой магазин из доступных к самовывозу имеется у всех товаров

                $s++;  // тут вся суть вопроса! если итерацию делаю как положено, после поиска в массиве, то в результате в  $arPickupID получаю все ID, с которыми идёт сравнение. А в этом варианте возвращает единственно общий

                if (in_array($storesAvailable[$s], $item)) {
                    $arPickupID[] = $storesAvailable[$s];
                }
                $i++;
            }
        }


Я не нашёл ответов на просторах гугла. Безумно интересно почему это работает так.
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
@gian_tiaga
Ваш код абсолютно нечитаем.
Вы неправильно используете foreach в принципе

Вот примерный псевдокод смотрите насколько всё проще. Возможно вам надо погонять алгоритмы, почитать про стандартные функции, база видно страдает сильно.

foreach ($products as $product) {
     if (!empty(array_intersect($product['stores'], $allowStores))) {
          $product['allow'] = true;
     }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы