PHP:将多个数组键的地址链接到另一个更大的数组


PHP: Link address of multiple array keys into another bigger array

我想将3个具有唯一键的小数组组合成一个大数组,但是当我修改大数组中的值时,我希望它也反映在相应的小数组中。

例如,我有这3个小数组:
$arr1 = ['key1' => 'data1', 'key2' => 'data2'];
$arr2 = ['key3' => 'data3', 'key4' => 'data4', 'key5' => 'data5'];
$arr3 = ['key6' => 'data6'];

我想有一个$bigArray,其中每个键的地址链接/映射到小数组的每个值。所以如果我这样写:

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

则将$arr2['key4']修改为相同的值('something else')。

如果我尝试这样做:

$bigArray = [&$arr1, &$arr2, &$arr3];
它会产生一个多维数组,其中包含映射到值的键。

我发现

<?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);

不能这样绑定数据,但可以将它们链接到同一个对象中:

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;
    }
}

可以看到,现在需要从$arrayLink对象访问$arr2:

$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