Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:将多个数组键的地址链接到另一个更大的数组中_Php_Arrays - Fatal编程技术网

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

PHP:将多个数组键的地址链接到另一个更大的数组中,php,arrays,Php,Arrays,我想将三个小数组(它们之间有唯一的键)组合成一个大数组,但当我修改大数组中的值时,我希望它也反映在相应的小数组中 例如,我有以下3个小阵列: $arr1 = ['key1' => 'data1', 'key2' => 'data2']; $arr2 = ['key3' => 'data3', 'key4' => 'data4', 'key5' => 'data5']; $arr3 = ['key6' => 'data6']; 我想要一个$bigArray,它

我想将三个小数组(它们之间有唯一的键)组合成一个大数组,但当我修改大数组中的值时,我希望它也反映在相应的小数组中

例如,我有以下3个小阵列:

$arr1 = ['key1' => 'data1', 'key2' => 'data2'];
$arr2 = ['key3' => 'data3', 'key4' => 'data4', 'key5' => 'data5'];
$arr3 = ['key6' => 'data6'];
我想要一个
$bigArray
,它将每个键的地址链接/映射到小数组的每个值。因此,如果我做一些类似的事情:

$bigArray['key4'] = 'something else';
$bigArray = [&$arr1, &$arr2, &$arr3];
然后它会将
$arr2['key4']
修改为相同的值(
'something'

如果我尝试以下方法:

$bigArray['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);

不能以这种方式绑定数据,但可以在同一对象中链接数据:

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

你为什么需要这个?也许你可以重新审视你的逻辑?因为没有简单的方法来完成它。你需要循环所有数组并指向实际值。我理解这种担心,你是对的,发布的每个解决方案在计算方面都非常昂贵,但这是我关于如何解决我的问题的第三个想法,它似乎不像我想的那么便宜。你的解决方案更像是一个搜索,而不是数组的实际映射。我很欣赏建议搜索的独创性,但如果有很多值需要更改,那么您的解决方案在计算方面会变得非常昂贵,不幸的是,这就是我的设想。如果我必须更改1或最多2个值,这是有意义的。我特别喜欢你的第三个解决方案,它在大型程序中非常容易阅读和理解。我希望有一个比简单地循环所有数组更好的解决方案,但遗憾的是,PHP没有所需的结构。