php массив foreach loop - PullRequest
       20

php массив foreach loop

2 голосов
/ 16 января 2011

Моя корзина покупок имеет значение array, и каждый элемент в ней также является array.

.Когда у меня есть совпадение, мне нужно знать позицию Предметов в основном массиве basket, чтобы я мог выполнять обновления и удаления.

Звучит очень просто, но я застрял на этом.

Пока у меня есть это

//Lets say there are 5 items in this basket array (each item is also an array)
foreach ($_SESSION['basket'] as $basketArray){

        //this loops through the items attributes (size, colour etc)
        //when the ID is a match, i need to find out what position I am at in the main     array
        foreach($basketArray at $key = > $value){

             if ($value == $itemID){

                   //now I just need to know how to return 0, 1, 2, 3,  or 4 so that i can do 'unset' later.
             }
        }
}

Спасибо за любую помощь.

Оззи

1 Ответ

6 голосов
/ 16 января 2011

Скажите, что это ваш $_SESSION['basket']:

Array
(
    [0] => Array
        (
            [id] => 12
            [name] => some name
            [color] => some color
        )

    [1] => Array
        (
            [id] => 8
            [name] => some name
            [color] => some color
        )

    [2] => Array
        (
            [id] => 3
            [name] => some name
            [color] => some color
        )

    [3] => Array
        (
            [id] => 22
            [name] => some name
            [color] => some color
        )

)

Сначала вам нужно пройти по всем отдельным элементам массива $_SESSION['basket']:

foreach ($_SESSION['basket'] as $i => $product) {
  /*
  $i will equal 0, 1, 2, etc.
  and is the position of the product within the basket array.

  $product is an array of itself, which will equal e.g.:

  Array
  (
      [id] => 12
      [name] => some name
      [color] => some color
  )
  */
}

Теперь вы хотитезнать, соответствует ли id продукта идентификатору продукта, который вы ищете.Вам не нужно проходить через каждый элемент массива $product, чтобы сделать это, при условии, что ваш ID всегда будет называться «id».Вместо этого просто проверьте поле id:

foreach ($_SESSION['basket'] as $i => $product) {
  if ($product['id'] == $someId) {
    // at this point you want to remove this whole product from the basket
    // you know that this is element no. $i, so unset it:

    unset($_SESSION['basket'][$i]);

    // and stop looping through the rest,
    // assuming there's only 1 product with this id:
    break;
  }
}

Обратите внимание, что существует опасность проверки значений, а не ключей.Скажем, у вас есть продукт, который создается следующим образом:

  Array
(
    [count] => 12
    [id] => 5
    [name] => some name
    [color] => some color
)

Если вы пройдете все значения, как сейчас, и попытаетесь сопоставить это с определенным идентификатором, что произойдет, когда этот идентификатор произойдет сбыть "12"?

// the id you're looking for:
$someId = 12;

foreach ($product as $key => $value) {
  // first $key = count
  // first $value = 12
  if ($value == $someId) {
    // ...
    // but in this case the 12-value isn't the id at all
  }
}

Итак: всегда ссылаться на конкретный элемент из массива, в данном случае это "id" (или любое другое имя, которое вы использовали в своем приложении).Не проверяйте случайные значения, так как вы не можете быть абсолютно уверены, что при совпадении это на самом деле правильное значение, которое вы ищете.

Удачи!

...