Php 数组是否可能知道其父数组?

Php 数组是否可能知道其父数组?,php,Php,考虑以下阵列: $super = [ "first" => ["first1","first2"], "second" => ["second1","second2"] ]; 现在让我们获取子阵列的引用: $sub = $super["second"]; 如何从子数组引用超级数组 我正在寻找一种方法来做这样的事情: var_dump($sub[../"first"]); 数组(大小=2) 0=>字符串“first1”(长度=6) 1=>字符串“first2”(长度=6

考虑以下阵列:

$super = [
  "first"  => ["first1","first2"],
  "second" => ["second1","second2"]
];
现在让我们获取子阵列的引用:

$sub = $super["second"];
如何从子数组引用超级数组

我正在寻找一种方法来做这样的事情:

var_dump($sub[../"first"]);
数组(大小=2) 0=>字符串“first1”(长度=6) 1=>字符串“first2”(长度=6)


通过创建如下自定义函数,您只能知道索引的父索引是什么:

function get_parent($key, $arr){
    $index = 0;
    foreach($arr as $keyCur => $val){
        if($keyCur === $key){
            $ret = [];
            $ret['indexOfKey'] = $index;
            $ret['valueOfKey'] = $val;
            return $ret;
        }
        $index++;
    }
    return false;
}
否,是作为有序哈希映射实现的。这意味着数组中的每个键都会被散列并直接映射到一个值。当然,该值可以是另一个数组,但映射不会反向。因此,在PHP或任何典型hashmap的实现中,值不能映射回键。散列只有一种方式

因此,在
$arr=[“foo”=>[“bar”]
中,
$arr
数组中的键
“foo”
将映射到值
[“bar”]
,该值恰好是另一个数组。但是没有办法按相反的顺序进行(即将值
[“bar”]
映射回
$arr
中的键
“foo”

如果您想要这种共递归关系,比如树或图,那么使用对象实际上更容易实现,因为对象没有数组所具有的按值复制语义

$obj = new stdClass;


$obj->first  = new stdClass;
$obj->second = new stdClass;

$obj->first->parent = $obj;
$obj->second->parent = $obj;

$obj->first->value = ["first1", "first2"];
$obj->second->value= ["second1","second2"];

$first = $obj->first; // now I can ask it for its parent
$second = $first->parent->second->value;
var_dump($second);
你得到

array(2) { [0]=> string(7) "second1" [1]=> string(7) "second2" } 阵列(2){ [0]=> 字符串(14)“我改变了你!” [1]=> 字符串(18)“我也改变了你!” } 阵列(2){ [0]=> 字符串(14)“我改变了你!” [1]=> 字符串(18)“我也改变了你!” }
不可能。PHP数组的链接只能“向下”运行,而不能向上运行。子数组不知道其父数组是什么。这是父母的责任来跟踪。谢谢@MarcB,这正是我所怀疑的。我认为这个链接会有帮助这是一个很好的例子。你能告诉我们你实际上想做什么而不是询问代码实现的细节吗?@naomik谢谢你的提问。这是一个复杂的问题,如果我仍然无法自己解决,那么当我可以将它分解为MVCE时,我会打电话给你。我认为这可能是一个可行的解决方案,并且很好奇它本身是否有可能。您能用我在问题中提供的示例演示一下吗?您可以很容易地找到“second”命名键的父键是什么,如下所示:$key=get_parent($second',$super);如果找到任何匹配项,它将返回一个包含indexOfKey和valueOfKey元素的数组,如果不匹配,它将返回false。感谢您提供了一个不错的替代方法!
$second = $first->parent->second;

$first->parent->second->value = ["I changed you!", "I changed you too!"];

// This magically gets the right value
var_dump($second->value, $obj->second->value);
array(2) { [0]=> string(14) "I changed you!" [1]=> string(18) "I changed you too!" } array(2) { [0]=> string(14) "I changed you!" [1]=> string(18) "I changed you too!" }