Intereting Posts
Сохранение изображений в базе данных mysql нарезать большой файл на куски и загрузить с помощью ajax и html5 FileReader Откройте класс Auth, чтобы разрешить вход в систему через facebook, google, твиттер и т. Д. -> так же, как SO Преобразование адресов из имени <address@domain.tld> в формат phpmailer Как указать два расположения шаблонов Twig? Правильный способ хранения часового пояса в базе данных? Копирование PHP-кода из учебника дает уведомления на моем компьютере Сертификат peer не может быть аутентифицирован с помощью известных сертификатов CA с использованием расширения PHP OAuth Как загрузить определенный div или id ajax и laravel Передача статических методов в качестве аргументов в PHP php hash формирует строку в целое число Как предотвратить заполнение пустых данных в таблице MySQL? XmlHTTPRequest: "Ошибка анализа XML: элемент не найден" PHP Mime type проверяет альтернативный способ сделать это? Laravel Homestead Swift Не удается отправить сообщение без адреса отправителя

Поиск ключа в массиве, рекурсивно

private function find($needle, $haystack) { foreach ($haystack as $name => $file) { if ($needle == $name) { return $file; } else if(is_array($file)) { //is folder return $this->find($needle, $file); //file is the new haystack } } return "did not find"; } 

Эй, этот метод ищет конкретный ключ в ассоциативном массиве и возвращает связанное с ним значение. Есть проблема с рекурсией. Любая подсказка?

Related of "Поиск ключа в массиве, рекурсивно"

Может быть, это слишком много, но смешно использовать RecursiveIterators 🙂

ОБНОВЛЕНИЕ: Может быть, это было слишком много для старых версий PHP, но с> = 5.6 (особенно с 7.0) я бы полностью использовал это без сомнения.

 function recursiveFind(array $array, $needle) { $iterator = new RecursiveArrayIterator($array); $recursive = new RecursiveIteratorIterator( $iterator, RecursiveIteratorIterator::SELF_FIRST ); foreach ($recursive as $key => $value) { if ($key === $needle) { return $value; } } } 

UPDATE: Кроме того, с PHP 5.6 с генераторами вы можете легко перебирать все элементы, которые пропускают фильтр, а не только первый:

 function recursiveFind(array $haystack, $needle) { $iterator = new RecursiveArrayIterator($array); $recursive = new RecursiveIteratorIterator( $iterator, RecursiveIteratorIterator::SELF_FIRST ); foreach ($recursive as $key => $value) { if ($key === $needle) { yield $value; } } } // Usage foreach (recursiveFind($haystack, $needle) as $value) { // Use `$value` here } 
 function array_search_key( $needle_key, $array ) { foreach($array AS $key=>$value){ if($key == $needle_key) return $value; if(is_array($value)){ if( ($result = array_search_key($needle_key,$value)) !== false) return $result; } } return false; } 

это сработает!

вам нужно остановить рекурсивный глубокий поиск, вернув false, а затем проверить его в функции.

вы можете найти больше примеров функций (например, используя RecursiveArrayIterator и многое другое) по этой ссылке: http://php.net/manual/en/function.array-search.php

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

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

 public function recursiveFind(array $array, $needle) { $iterator = new RecursiveArrayIterator($array); $recursive = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST); $aHitList = array(); foreach ($recursive as $key => $value) { if ($key === $needle) { array_push($aHitList, $value); } } return $aHitList; } 

попробуй это:

 array_walk_recursive( $arrayToFindKey, function($value, $key, $matchingKey){ return (strcasecmp($key, $matchingKey) == 0)? true : false; } , 'matchingKeyValue' ); 

Лучшее решение выше пропускает случай, если ключ повторяется и возвращает только первое значение, здесь я получаю все значения в массиве:

 function recursiveFind(array $array, $needle) { $iterator = new RecursiveArrayIterator($array); $recursive = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST); $return = []; foreach ($recursive as $key => $value) { if ($key === $needle) { $return[] = $value; } } return $return; }