2012-03-13 1 views
4

array_values()은 ArrayAccess 개체에서 작동하지 않습니다. 도 않습니다 array_keys()ArrayAccess 개체와 함께 array_values가 작동하지 않습니다.

왜? 내가 $object['key']에 액세스 할 수 있는지

나는

+0

예제를 보여주십시오. – powtac

+0

array_keys ($ arrayaccessobject); ? – thelolcat

+0

array_key_exists()도 작동하지 않는다는 내용의 http://www.php.net/manual/en/class.arrayaccess.php#104061 주석이 있습니다. – powtac

답변

4

아니, 당신은 ArrayAccess의 유틸리티를 오해 한 배열 작업의 모든 종류의 일을 할 수 있어야합니다. 배열을위한 일종의 래퍼가 아닙니다. 예, 구현을위한 표준 예는 기능이 클래스에 의해 래핑 된 개인 $array 변수를 사용하지만 특히 유용하지는 않습니다. 종종 배열을 사용할 수도 있습니다.

ArrayAccess의 한 가지 좋은 예는 스크립트가 사용 가능한 변수를 알 수없는 경우입니다.

매우 어리석은 예로 원격 서버에서 작동하는 개체를 상상해보십시오. 해당 서버의 리소스는 네트워크에서 API를 사용하여 읽고, 업데이트하고 삭제할 수 있습니다. 프로그래머는 배열과 유사한 구문으로 해당 기능을 래핑하려고한다고 결정하므로 $foo['bar'] = 'foobar'은 해당 서버의 bar 리소스를 foobar으로 설정하고 echo $foo['bar']을 검색합니다. 스크립트는 모든 가능한 값을 시도하지 않고 어떤 키 또는 값이 있는지 알아낼 방법이 없습니다.

그래서 ArrayAccess는 배열 구문을 사용하여 개체를 설정, 업데이트, 검색 또는 삭제할 때 배열 구문을 사용할 수 있습니다.

다른 인터페이스 Countablecount()을 사용할 수 있습니다. 동일한 클래스에서 두 인터페이스를 모두 사용할 수 있습니다. 이상적으로는 array_values 또는 array_keys을 수행 할 수있는 인터페이스를 포함하여 더 많은 인터페이스가있을 수 있지만 현재 존재하지 않습니다.

2

ArrayAccess은 매우 제한되어 있습니다. 기본 array_ 기능의 사용을 허용하지 않습니다 (기존 인터페이스는 없음).

개체에 대해 더 많은 배열과 같은 작업을 수행해야하는 경우 본질적으로 컬렉션을 만듭니다. 콜렉션은 메소드에 의해 조작되어야합니다.

따라서 개체를 만들고 ArrayObject을 확장하십시오. 이것은 IteratorAggregate, Traversable, ArrayAccess, SerializableCountable을 구현합니다. 당신은 키가 필요한 경우

, 단순히 array_keys 방법 추가 : 다음

public function array_keys($search_value = null, $strict = false) 
{ 
    return call_user_func_array('array_keys', array($this->getArrayCopy(), $search_value, $strict)); 
} 

을 할 수 있습니다 다음 ArrayObject/ArrayAccess 객체가 배열로 작업 할 수 있습니다,하지만 그들은 아직도

foreach ($object->array_keys() as $key) { 
    echo $object[$key]; 
} 
0

사물.

var_dump(array_keys(get_object_vars($ArrObj))); 

또는 (array) $ArrObj, 예를 들어,에 의해 배열로 캐스팅하여 ArrayObject 변환 : 그래서 대신 (배열에서만 작동) array_keys()의 당신은 예를 들어, get_object_vars()를 사용한다:

var_dump(array_keys((array)$ArrObj));