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