다차원 배열에서 선형 검색 알고리즘 (위의 선형)은 깊이가 전체 배열을 순회하는 데 필요한 반복 횟수를 증가 시키므로 복잡성이 복잡해 지므로주의하십시오. 예 :
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
적절한 알고리즘을 사용하여 원하는 것을 찾는 데 최대 200 회 반복해야합니다 (바늘이 [100] [1] 인 경우).
이 경우 선형 알고리즘은 O (n) (전체 배열의 총 요소 수 순서)에서 수행됩니다. 이는 불량한 것으로, 백만 개의 항목 (예 : 1000x100x10 배열)은 평균 500,000 회 반복하여 바늘을 찾습니다. 다차원 배열의 구조를 변경하기로 결정하면 어떻게 될까요? 그리고 깊이가 100을 초과하면 PHP는 재귀 알고리즘을 시작합니다. 컴퓨터 과학은 다음과 같이 더 잘할 수 있습니다.
가능하면 항상 다차원 배열 대신 객체를 사용하십시오.
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
사용자 정의 비교기 인터페이스 및 기능을 적용하여 정렬하고 찾습니다.
interface Comparable {
public function compareTo(Comparable $o);
}
class MyObject implements Comparable {
public function compareTo(Comparable $o){
...
}
}
function myComp(Comparable $a, Comparable $b){
return $a->compareTo($b);
}
당신이 사용할 수있는 uasort()
당신이 분류하고이를 관리 할 수 있습니다 개체에 대한 자신의 컬렉션을 구현해야 모험을 좋아하는 경우, 사용자 정의 비교를 사용하는 (난 항상 최소한의 검색 기능을 포함하는 ArrayObject을 확장).
$arrayObj->uasort("myComp");
일단 정렬되면 (uasort는 O (n log n), 임의의 데이터를 얻는 것만 큼 낫습니다), 이진 검색은 O (log n) 시간에 연산을 수행 할 수 있습니다. 검색. 사용자 정의 비교기 이진 검색이 PHP에서 구현되지 않는다는 것을 알고있는 한 ( array_search()
속성이 아닌 객체 참조에서 작동하는 자연 순서 사용), 내가하는 것처럼 이것을 직접 구현해야합니다.
객체가 정렬 방식을 정의하므로 코드를 무한히 재활용 할 수 있으므로이 방법은 더 효율적이고 (더 이상 깊이는 없지만) 더 중요합니다 (인터페이스를 사용하여 비교 가능성을 적용한다고 가정). 훨씬 더 나은 =)
$key
가 없습니까? 하는 것이 낫지if (array_key_exists($key, $array) && $array[$key] == $value) {
않습니까?