2016-07-20 6 views
0

고유해야하는 배열에서 요소를 추가 및 제거해야한다고 가정합니다.PHP 배열 키를 사용하여 데이터 저장

Class A { 
    protected $elements = []; 

    function add($element) { 
     if (!in_array($element, $this->elements)) { 
      $this->elements[] = $element; 
     } 
    } 

    function remove($element) { 
     if (($key = array_search($element, $this->elements)) !== false) { 
      unset($this->elements[$key]); 
     } 
    } 
} 

이 잘 보이지만 $elements이 요소의 큰 거래를 경우 PHP는 add() 또는 remove()가 호출 될 때마다 반복해야합니다. 대신에 나는이 작업을 수행 할 수 있습니다

Class A { 
    protected $elements = []; 

    function add($element) { 
     $this->elements[$element] = true; 
    } 

    function remove($element) { 
     unset($this->elements[$element]); 
    } 
} 

어떤 해야에 관계없이 요소의 수와 동일한 속도로 수행 할 수 있지만 이것에 대해 완전히 잘못 될 수 있으며, 그이 질문의 포인트입니다.

나는 코드에서이 모든 작업을 수행했지만 아무런 도움이되지 않지만 쓸모없는 정보 (이 예의 일부는 true 부울)를 저장하고있다. 이것은 어떤 종류의 결함으로 나타나며,이 방법이 내가 생각하기에 완전하게 방탄하지 않다는 것을 알려줍니다.

이보다 더 나은 배열에 정보를 저장하는이 방법입니다, 불필요한 정보를 저장 제외하고, 제가 생각은 적절한 방법, 첫 번째 예제 간주 될 수 있으며 어떤 단점이있다?

답변

1

두 번째 솔루션은 첫 번째 솔루션보다 훨씬 빠릅니다.

단점은 훨씬 더 많은 메모리가 필요하며 정수와 문자열 만 저장할 수 있다는 것입니다.

합리적으로 많은 수의 요소를 추가/제거하는 경우 두 번째 해결 방법을 사용하십시오.

수십억 또는 수백만 개의 요소가 예상되는 경우 두 번째 솔루션은 메모리 부족 예외가 발생할 수 있으므로 첫 번째 솔루션을 사용해야합니다.

+0

왜 두 번째 솔루션이 더 많은 메모리를 차지합니까? 열쇠를 해싱했기 때문입니까? –

+0

예, PHP 배열을 해시 테이블로 사용하면 더 많은 메모리를 사용합니다. –

+0

순차 배열도 해시 테이블이므로 왜 이러한 배열은 연관 배열보다 적은 공간을 차지합니까? –