2012-12-03 4 views
0

나는 다차원 배열로 표현 된 데이터가 있습니다. 이 데이터를 내 OO 애플리케이션에 임베드하고 이러한 데이터에 추가 기능을 제공 할뿐만 아니라 전통적인 무작위 액세스와 반복기를 사용하여 액세스하는 방법 (foreach를 사용할 수 있도록)을 원합니다. 즉 다차원 배열에 대한 래핑 클래스를 구현하고 싶습니다.PHP - 다차원 배열 래퍼 클래스

이미 시도한 것들 :

I.에게 ArrayAccess 를이 하나의 문제는 이와 같이 I 참조로 반환 할 수 있으며, 서버가 PHP 5.2.17 사용하고 &offsetGet() 오류를 제공한다는 것이다, 의미 나는 다차원 요소 액세스를 구현할 수없는 옵션 현재

$obj[$key1][$key2] = $value; 

주, 최신 PHP 버전이 업그레이드되어

II. 마법 방법 사용하기 이것은 약간 까다 롭지 만 변수를 키로 사용하려고하면 문제가 발생합니다. 예 :

$obj->$key1[$key2] = $value; 

인터프리터는 먼저 $key1[$key2]는 통지를 던지고 $ 키 1의 첫 번째 문자를 반환 평가하고, 사용하는 내 배열 키로. 이 문제를 어떻게 해결할 지 모르겠습니다. 나는 작업 우선 순위를 강제로 대괄호를 사용하여 생각했지만 내 다음 시도에서와 같은 문제가 있었다 :

III. 간단한 get 및 set 함수 사용하기 이전 PHP. 그것은 쓸려고 할 때 울기도합니다 :

$obj->get($key1)[$key2] = $value; 

둥근 괄호로 끝나는 식의 색인 방법을 알지 못하기 때문에 울부 짖습니다.

잃어버린 리조트 옵션이 있습니다. 배열을 공개하고 모든 것을 잊어 버려라. 그러나 거기에 가기 전에는 실제로이 일을하는 다른 방법이 없다는 것을 확신하고 싶습니다.

답변

2

때로는 예제와 함께 가장 잘 나타납니다. 예를 들어 주문한 수량의 제품을 가진 다차원 배열을 가질 수 있습니다. 첫 번째 색인은 고객을 정의하고, 두 번째 색인은 주문을, 세 번째 색인은 제품을 정의합니다. 값은 수량입니다.

IV. 하지만 여러 매개 변수와 함께 간단한 get 및 set 함수를 사용 :

$value = $obj->get($key1, $key2); 
$obj->set($key1, $key2, $value); 

또는

$quantity = $orderedQuantities($customerName, $orderNo, $productCode); 

객체 래퍼를 작성의 본질은,이 물체처럼 보이는 등처럼 행동한다는 것이다. 배열처럼 보이고 동작하도록 구현하면 배열을 사용할 수도 있습니다. 배열처럼 작동하는 객체에 배열을 래핑하는 유일한 이유는 & 매개 변수를 사용하지 않고 참조로 전달할 수 있다는 것입니다.

목표가 맞으면 배열을 $ obj에 할당하고 $obj->arrayprop[$key1][$key2]을 사용하십시오. 반면에 객체처럼 동작하도록하려면 배열 구문을 건너 뜁니다.

V. 사용하여 중첩 된 개체 그래서, 당신은 고객을 쓸 수 같은 예제를 사용 순서 오브젝트 등을 내장 (컬렉션의 종류) .. 객체

$ 수량 = $ customers-> getCustomerByName ($ customerName) -> getOrder ($ orderNo) -> getProduct ($ productCode) -> 수량;

또는, 더 읽을 수 있도록 :

$ 고객 = $ customers-> getCustomerByName ($ CUSTOMERNAME); $ order = $ customer-> getOrder ($ orderNo); $ orderLine = $ order-> getOrderLine ($ productCode); $ 수량 = $ 제품 -> 수량;

이제 이러한 엔티티 각각은 객체로 표현됩니다. 장점은 추가 속성으로이 구조체를 쉽게 확장 할 수 있다는 것입니다. 특정 고객을 찾기 위해 고객 컬렉션 'findByCustomerNo'및 'findByName'메소드를 제공 할 수 있지만 해당 우편 코드의 고객 만 포함하는 새 콜렉션을 반환 할 수있는 'filterByPostalCode'도 제공 할 수 있습니다.

$ order에는 이제 합계를 계산하는 함수가 포함될 수 있습니다.

$ orderLine에는 productCode (키) 및 수량 만 포함될 수 있지만 객체로 지정하면 할인, 맞춤 이름 또는 설명 또는 기타 속성을 쉽게 추가 할 수 있습니다.

이 구조체는 처음에는 좀 더 많은 타이핑이 필요하고 익숙해지기는하지만 많은 유연성을 허용합니다.

+0

내 첫번째 생각은 모양과 추가 배열과 같은 기능을 가진 배열과 같이 동작하는 객체를 구현하는 것이 었습니다. 그러나 PHP 5.2.17에서 배열처럼 보이는 것을 구현할 수 없다는 것이 밝혀졌습니다. 그래서 나는 적어도 "비슷한 모양과 약간의"부분으로 머물려고 노력했다. 하지만 실제로 그렇게 할 수는 없습니다. 답해 주셔서 감사합니다. 가장 직접적 인'$ obj-> arrayprop [$ key1] [$ key2]'방법을 사용합니다. 정말 못 생겼지 만, 뭐든간에. 나는 이미 너무 많은 PHP를 싫어한다. – SinistraD

+0

그것은 정신 (나는 실제로 그렇게 동의한다)이다. :) 그러나 어쩌면 당신의 마음을 바꾸기 위해, 나는'V. 중첩 된 객체 사용하기 .' – GolezTrol

+0

이 중첩 된 객체는 실제로 잘 작동합니다. 당신이 묘사 한 것뿐만 아니라 일반적인 방법으로도 말입니다. 중첩 된 객체를 사용하면 I에서 참조로 전달하는 문제를 해결할 수 있으므로 ArrayAccess를 다시 사용할 수 있습니다. 답변으로 내 코드를 게시합니다. 올바른 방향으로 안내해 주셔서 감사합니다. 모든 것을 일반적인 방식으로 중단하십시오. 내 코드를 버리고 다시 생각해 보도록하겠습니다. 장래에 사용할 수있는 가능한 모든 방법에 대한 문제에 조금 더 집중하십시오. – SinistraD

0

중첩 된 객체를 사용하면 참조를 전달하지 않고도 ArrayAccess를 사용할 수 있습니다. 그러나 배열 함수를 완전히 잊어 버릴 수 있습니다.

<?php 
class ArrObj implements ArrayAccess { 
    private $arr; 

    public function __construct($arr = null) { 
     $this->arr = $arr; 
    } 

    public function offsetExists($key) { 
     return isset($this->arr[$key]); 
    } 

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

    public function offsetSet($key, $val) { 
     return $this->arr[$key] = $val; 
    } 

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

$a = new ArrObj(array(
    'foo' => new ArrObj(array(
     'bar' => 'qwe' 
    )) 
)); 

echo $a['foo']['bar'] . '<br />'; 
$a['foo']['bar'] = 'asd'; 
echo $a['foo']['bar'] . '<br />'; 
?> 

출력 :

qwe 
asd