Массивы PHP: индексированный против ключевого

#php #arrays #indexing #associative-array

#php #массивы #индексирование #ассоциативный-массив

Вопрос:

У меня есть метод, fetch_widgets , который извлекает виджеты из базы данных (MySQL). Я передаю ему $options массив, чтобы я мог выборочно добавлять предложения WHERE и JOIN , добавлять / удалять столбцы и т.д.

Например:

     $options = array();
    $options[] = 'include_disabled';
    $options[] = 'include_tag_ids';
    $options['start_date'] = '2011-01-01';
    $options['end_date'] = '2011-01-31';
  

В fetch_widgets я проверяю параметры, используя либо:

     if(array_key_exists('start_date',$options)) { ... }
  

или:

     if(in_array('include_tag_ids',$options)) { ... }
  

в зависимости от того, активирована опция или нет, она просто должна присутствовать (например include_disabled ) или иметь ключ и значение (например end_date ).

Я сталкиваюсь с трудностями, потому что получаю странные результаты из-за того, in_array что $options массив содержит значения с ключом и без ключа. Кто-нибудь может пролить свет на это?

Комментарии:

1. Что за странное поведение вы получаете?

2. Учитывая приведенный выше $options массив, у меня был in_array('include_tag_ids',$options) возврат false. Кажется, я решил это сейчас, не уверен, что я изменил, но это снова работает

Ответ №1:

Не смешивайте массивы с ключом и массивы без ключа, если вам нужно согласованное поведение.

Вместо этого сделайте что-то вроде этого:

 $options = array();
$options['include_disabled'] = true;
$options['include_tag_ids'] = true;
$options['start_date'] = '2011-01-01';
$options['end_date'] = '2011-01-31';
  

Комментарии:

1. 1 Я абсолютно согласен, хотя мне все равно было бы интересно узнать, с какой проблемой он сталкивается и почему.

2. Мне тоже любопытно. Основываясь на том, что он показывал, теоретически это должно сработать, но кто знает.

3. Мне тоже любопытно! Если это снова всплывет, я обязательно вернусь.