2017-09-06 7 views
0

독자,중복 키를 사용하여 배열을 만들 때 오류가 발생하는 방법은 무엇입니까?

동료가 행을 복제 할 때 약간 실수를해서 PHP가 오류를 발생시키지 않아 최근에 디버깅에서 40 분이 걸렸습니다.

원래 선은 선이 정말

$files = [ 
    'identifier1' => '/path/to/file3' 
]; 
과 같은 어느

$files = [ 
    'identifier1' => '/path/to/file1', 
    'identifier1' => '/path/to/file2', 
    'identifier1' => '/path/to/file3' 
]; 

이었다 어떻게 중복

$files = [ 
    'identifier1' => '/path/to/file1', 
    'identifier2' => '/path/to/file2', 
    'identifier3' => '/path/to/file3' 
]; 

$files = [ 
    'identifier1' => '/path/to/file1' 
]; 

의도 라인에 유사했다

실수로 PHP가 중복 키를 사용하여 배열을 정의하려고 시도 할 때 PHP가 오류를 발생시키는 방법이 있습니까?

이 옵션을 전역 적으로 사용하고 싶습니다. error_reporting (E_ALL)은 슬프게도 작동하지 않습니다.

+0

동일한 키가 자동으로 덮어 씁니다. 따라서 최소한 두 번 이상 동일한 키를 얻을 수 없습니다.그래서 기본적으로'$ files = [ 'identifier1'=> '/ path/to/file1', 'identifier2'=> '/ path/to/file2', 'identifier3'=> '/ path/to/file3 ' ];'PHP에서는 달성 할 수 없습니다. 이것 후에 당신의 질문은 무엇입니까? –

+0

@WOUNDEDStevenJones 그는 동일한 열쇠를 보여 주었고, 그래서 그들은 덮어 썼습니다. 그는 가치관에 대해 말하는 것이 아닙니다. –

+0

@AlivetoDie 네 말이 맞아. 키를 확인하기 위해 http://php.net/manual/en/function.array-keys.php도 포함하도록 제안하려고했으나 어쨌든 작동하지 않습니다. 왜냐하면'count ($ files)' 어쨌든 1이 아니라 3을 반환합니다. – WOUNDEDStevenJones

답변

0

이것은 PHP에서 오류로 간주되지 않습니다. 단순히 키/값 쌍을 덮어 쓰는 것입니다.

이 방법을 확인하는 유일한 방법은 count()$files 인 것을 확인한 후에 정의해야한다고 생각하는 항목이 많은지 확인하는 것입니다. 카운트가 너무 낮 으면 Exception을 던지거나 오류를 기록 할 수 있습니다.

0

당신이 미리 만들어진 배열과 소스 제공하는 경우 : 그 것처럼이 코드를 컴파일로

$list = [ 
    'one' => 1, 
    'two' => 2, 
    'one' => 3, 
]; 

이 그 다음은, 런타임 체크와 중복 키를 감지 할 단순히 수 없습니다를 :

$list = [ 
    'two' => 2, 
    'one' => 3, 
]; 

즉, 코드가 실행되기 전에 중복 키가 사라지고 작성한 모든 코드에는 첫 번째 항목이 표시되지 않습니다. 코드를 개별 행으로 작성하는 경우 :

$list['one'] = 1; 
$list['two'] = 2; 
$list['one'] = 3; 

그런 다음 몇 가지 옵션이 있습니다. ArrayAccess을 구현하는 클래스를 만든 다음 offsetSet() 메서드를 작성하여 새 오프셋을 쓸 때마다 지정된 오프셋이 이미 존재하는지 확인하십시오. 클래스는 본질적으로 배열이 어디에 있든 사용할 수 있습니다.

class UniqueArray implements ArrayAccess 
{ 

    protected $data = []; 

    public function offsetExists($key) 
    { 
     return array_key_exists($key, $this->data); 
    } 

    public function offsetGet($key) 
    { 
     return $this->data[$key]; 
    } 

    public function offsetSet($key, $value) 
    { 
     if ($this->offsetExists($key)) { 
      throw new Exception("key '$key' already exists"); 
     } 
     $this->data[$key] = $value; 
    } 

    public function offsetUnset($key) 
    { 
     unset($this->data[$key]); 
    } 

} 

$list = new UniqueArray(); 
$list['one'] = 1; 
$list['one'] = 2; // throws an exception 

나는 그것이 가치가있는 것보다 더 많은 문제가있을 것이라고 생각합니다.

유일한 옵션은 정적 코드 분석입니다. 실제 소스 코드에서 이러한 중복 키 인스턴스를 찾으려고 시도하는 PHPCS에 대해 직접 냄새를 맡을 수도 있습니다. 이 문제를 발견하려면 소스 코드에서 분석 도구를 실행해야합니다.