2016-11-09 1 views
2

고유 한 키가있는 3 개의 작은 배열을 1 개의 큰 배열로 결합하고 싶지만 큰 배열의 값을 수정할 때 대응하는 작은 배열. PHP : 다중 배열 키의 주소를 다른 더 큰 배열로 연결

예를 들어 나는이 3 개 작은 배열을 가지고 :

$arr1 = ['key1' => 'data1', 'key2' => 'data2']; 
$arr2 = ['key3' => 'data3', 'key4' => 'data4', 'key5' => 'data5']; 
$arr3 = ['key6' => 'data6']; 

내가 작은 배열의 각 값에 매핑 링크 된 각 키의 주소를 /이있는 $bigArray을 갖고 싶어. 내가 좋아하는 뭔가를 할 경우에 따라서 :

$bigArray['key4'] = 'something else'; 

을 다음은 같은 값 ('something else')에 $arr2['key4']을 수정합니다.

$bigArray = [&$arr1, &$arr2, &$arr3]; 

그것은 매핑 된 값으로 키를 사용하여 다차원 배열을 만드는 불행한 결과가되어,

내가 좋아하는 뭔가를하려고하면.

+0

왜 필요합니까? 어쩌면 당신의 논리를 다시 방문 할 수 있을까요? 그것을 성취 할 수있는 간단한 방법이 없기 때문입니다. 모든 배열을 반복하고 실제 값을 가리키는 포인터를 만들어야합니다. – sevavietl

+0

우려 사항을 고맙게 생각합니다. 당신이 옳습니다. 게시 된 모든 해결책은 현명한 계산으로 매우 비쌉니다.하지만 이것은 제 문제를 해결하는 방법에 관한 제 3의 아이디어이며, 제가 생각한 것만 큼 싸지는 않습니다. – DarthRevan13

답변

2

두 가지 방법이 난

3 방식으로 기능을

<?php 
error_reporting(E_ALL); 

$arr1 = ['key1' => 'data1', 'key2' => 'data2']; 
$arr2 = ['key3' => 'data3', 'key4' => 'data4', 'key5' => 'data5']; 
$arr3 = ['key6' => 'data6']; 

$big = []; 
if (true) { 
    foreach (['arr1', 'arr2', 'arr3'] as $v) { 
     foreach (array_keys($$v) as $k) { 
      $big[$k] = &${$v}[$k]; 
     } 
    } 
} 
else { 
    foreach ([&$arr1, &$arr2, &$arr3] as &$v) { 
     foreach (array_keys($v) as $k) { 
      $big[$k] = &$v[$k]; 
     } 
    } 
} 


$big['key1'] = 'data1mod'; 
print_r($big); 
print_r($arr1); 
을 발견

$big = []; 
$bindToBig = function (&$a) use (&$big) { 
    foreach (array_keys($a) as $k) { 
     $big[$k] = &$a[$k]; 
    } 
}; 

$bindToBig($arr1); 
$bindToBig($arr2); 
$bindToBig($arr3); 
+0

특히 제 3의 솔루션을 좋아합니다. 큰 프로그램에서 읽고 이해하기가 매우 쉽습니다. 단순히 모든 배열을 반복하는 것보다 나은 해결책이 있기를 기대했지만 PHP에는 필요한 구성이 없습니다. – DarthRevan13

1

당신은 그런 식으로 데이터를 바인딩 할 수는 없지만이 같은 객체에서 그들을 연결할 수 있습니다

class ArrayLink { 
    public $bigArray; 
    public $linkedChildrenArray; 
    protected $childrenArray; 

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

    public function changeValueForKey($arrKey, $arrValue) { 
     foreach ($this->childrenArray as $key => $value) { 
      foreach ($value as $subKey => $subValue) { 
       if ($arrKey == $subKey) { 
        $this->bigArray[ $subKey ]    = $arrValue; 
        $this->childrenArray[ $key ][ $subKey ] = $arrValue; 
       } 
      } 
     } 
     $this->linkedChildrenArray = (object) $this->childrenArray; 
    } 
} 

보시다시피 $ arr2가 $arrayLink 개체 (예 :

)에 액세스해야합니다.
$arr1 = [ 'key1' => 'data1', 'key2' => 'data2' ]; 
$arr2 = [ 'key3' => 'data3', 'key4' => 'data4', 'key5' => 'data5' ]; 
$arr3 = [ 'key6' => 'data6' ]; 

$arrayLink = new ArrayLink(array('arr1' => $arr1, 'arr2' => $arr2, 'arr3' => $arr3)); 
$arrayLink->changeValueForKey('key3', 'new value for key 3'); 

echo $arrayLink->bigArray['key3']; //new value for key 3 
echo $arrayLink->linkedChildrenArray->arr2['key3']; //new value for key 3 
+1

귀하의 해답은 배열의 실제지도 대신 검색이 더 많습니다. 검색 제안에 대한 독창성에 감사하지만 변경해야 할 가치가 많으면 솔루션이 비용이 많이 드는 계산이되고 불행히도 그것이 내 시나리오입니다. 1 또는 최대 2 값을 변경해야한다면 의미가 있습니다. – DarthRevan13