Другой результат с in_array() и isset()

У меня есть такой массив $box_activ

Array
(
    [0] => categories
    [1] => add_a_quickie
    [2] => last_viewed
    [3] => whats_new
    [4] => wishlist
)

Проверяя с

in_array('categories', $box_activ)

результат true.

Почему я получаю false в результате проверки с помощью

isset($box_activ['categories'])

Я думал, что isset() - более производительный метод in_array().


person Ronny Linsener    schedule 26.10.2013    source источник
comment
проверьте этот blog.straylightrun.net /2008/12/03/   -  person user2092317    schedule 26.10.2013


Ответы (4)


Потому что один проверяет, установлен ли индекс/ключ в массиве, а другой проверяет, присвоено ли равное значение любому из индексов/ключей в массиве.

Array
(
    [0] => categories
    [1] => add_a_quickie
    [2] => last_viewed
    [3] => whats_new
    [4] => wishlist
)

0, 1, 2, 3, 4 — это индексы/ключи и категории, add_a_quickie и т. д. — значения, которые имеет каждый индекс.

isset($box_activ[0])
# should then return true.

Чтобы пройти массив с ключом и значением:

foreach($array AS $key=>$value)

Массив в PHP работает почти так же, как хэш-карта, в том смысле, что строки также могут быть индексами/ключами:

$array['some string'] = 'some value';
echo $array['some string'];
# should print 'some value' to screen.
person Horse SMith    schedule 26.10.2013
comment
Хорошо, моя ошибка, это действительно работает. Есть ли способ изменить его вместо ввода индексов? - person Ronny Linsener; 26.10.2013
comment
Я видел, как вы прокомментировали какой-то цикл foreach... Я обновлю свой ответ тем, как пройти весь массив с помощью ключа и значения. - person Horse SMith; 26.10.2013
comment
Это то, что я пробовал несколько минут назад. Я также попробовал это с помощью array_flip(), поэтому мне не нужно менять много частей кода. - person Ronny Linsener; 27.10.2013

$box_activ['categories'] получает элемент, индексированный categories в массиве $box_activ. Этот элемент не существует, поскольку categories является значением элемента с индексом 0.

isset действительно быстрее, чем in_array, но in_array должен перебирать весь массив, а isset должен проверять только переменную, которую вы ему передали.

person Patrick Kostjens    schedule 26.10.2013

isset($box_activ['categories']) вернул ложь, потому что categories является элементом try isset($box_activ[0])

person Community    schedule 26.10.2013

В массиве нет значения с ключом «категории». Ключ для категорий равен 0, поэтому, чтобы использовать isset, вам нужно получить ключ для этого значения.

$key = array_search('categories', $box_activ);

а потом

isset($box_activ[$key])

будет истинным, хотя нет необходимости проверять это, поскольку array_search уже проверил, что в массиве есть значение категорий

person Charlie Martin    schedule 26.10.2013
comment
Есть ли способ изменить это с помощью дополнительного ключа? На самом деле следующий цикл foreach выглядит как `foreach ($boxes as $box) { if (in_array($box, $box_activ)) { require_once DIR_WS_BOXES. $ коробка . '.php'; } }`` - person Ronny Linsener; 26.10.2013