2013-12-15 2 views
1

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

private function checkKeyIsInArray($dataItemName, $array) 
{ 
    foreach ($array as $key => $value) 
    { 
     // convert $key to string to prevent key type convertion 
     echo '<pre>The key: '.(string) $key.'</pre>'; 

     if ((string)$key == $dataItemName) 
      return true; 

     if (is_array($value)) 
      return $this->checkKeyIsInArray($dataItemName, $value); 

    } 
    return false; 
} 

Вот мой массив stucture:

Array (
    [0] => Array ([reset_time] => 2013-12-11 22:24:25) 
    [1] => Array ([email] => [email protected]) 
) 

Метод перемещает первую ветвь массива, но не вторую. Может ли кто-нибудь объяснить, почему это возможно? Кажется, я что-то упускаю.

+0

Можете ли вы показать, чтобы вывести вывод в свой вопрос, пожалуйста? –

+0

пример вашего многомерного массива ... – Prix

+0

Почему вы не используете array_key_exists, встроенный в функцию PHP? – user602525

ответ

4

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

private function checkKeyIsInArray($dataItemName, $array) 
{ 
    foreach ($array as $key => $value) 
     { 
      // convert $key to string to prevent key type convertion 
      echo '<pre>The key: '.(string) $key.'</pre>'; 

      if ((string)$key == $dataItemName) 
       return true; 

      if (is_array($value) && $this->checkKeyIsInArray($dataItemName, $value)) 
       return true; 

     } 
    return false; 
} 

BTW, почему это нестатическая функция? Кажется, он не нуждается в каких-либо свойствах экземпляра.

+0

Спасибо, Бармар, я попробую ваши предложения позже сегодня днем. Что касается вашего запроса о статическом или нет методе, вы правы - ему не нужны свойства экземпляра. Однако я не уверен, как использование метода 'static' будет способствовать приложению. Метод существует внутри моего объекта как часть процесса для изменения структуры данных, которая существует в каждом из моих объектов значений. На этом этапе я не нашел другого использования для этого метода. Если есть какой-то другой императив, чтобы сделать его статичным, то я обязательно должен посмотреть на это. Не могли бы вы объяснить, почему я должен статично? –

+0

Это просто причина чистоты кодирования. Если метод не зависит от экземпляра, то это делает его статическим. В реализации также может быть определенная эффективность, так как это один параметр, который нужно передать (нестатические методы получают '$ this' как неявный параметр), а поиск метода не требует сканирования виртуальных таблиц. – Barmar

+1

Спасибо, Бармар. +1 для руководителей по статическим методам - ​​пища для размышлений. –

Смежные вопросы