문제:
제공된 find() 메소드는 재귀적으로 키를 검색하려고 합니다. 연관 배열에서 특정 키를 검색하고 연관된 값을 반환합니다. 그러나 재귀 구현에 문제가 있습니다.
해결 방법:
원본 코드의 문제는 재귀와 관련이 있습니다. 현재 수준에서 일치하는 항목이 없는 경우를 처리하지 않고 직접 재귀 호출의 출력을 반환하려고 시도합니다. 이로 인해 배열의 더 깊은 일치 항목이 존재하는지 여부에 관계없이 "찾지 못함"이라는 잘못된 반환 값이 발생할 수 있습니다.
이를 수정하려면 다음 코드를 사용하여 재귀를 올바르게 처리할 수 있습니다.
<code class="php">private function find($needle, $haystack) { foreach ($haystack as $name => $file) { if ($needle == $name) { return $file; } else if(is_array($file)) { //is folder $result = $this->find($needle, $file); //file is the new haystack if ($result !== "did not find") { return $result; } } } return "did not find"; }</code>
이 업데이트된 함수는 재귀 호출 결과가 더 깊은 수준에서 일치 항목을 찾았음을 나타내는 "찾지 못함"이 아닌지 확인합니다. 이 경우 찾은 값을 반환합니다. 그렇지 않으면 이전과 같이 "찾지 못함" 값을 반환합니다.
대체 솔루션:
최신 PHP 버전(5.6 이상)에서는 반복자와 /또는 생성기가 더 효율적이고 우아할 수 있습니다.
<code class="php">function recursiveFind(array $haystack, $needle) { $iterator = new RecursiveArrayIterator($haystack); $recursive = new RecursiveIteratorIterator( $iterator, RecursiveIteratorIterator::SELF_FIRST ); foreach ($recursive as $key => $value) { if ($key === $needle) { return $value; } } }</code>
이 함수는 반복자를 사용하여 다차원 배열을 효율적으로 탐색하고 첫 번째로 일치하는 키를 찾습니다.
또한 생성기를 사용하여 반복할 수 있습니다. 첫 번째 요소뿐만 아니라 일치하는 모든 요소에 대해:
<code class="php">function recursiveFind(array $haystack, $needle) { $iterator = new RecursiveArrayIterator($haystack); $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 }</code>
위 내용은 PHP에서 다차원 배열의 키를 재귀적으로 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!