考虑这个数组:
$super = [
"first" => ["first1","first2"],
"second" => ["second1","second2"]
];
现在让我们抓住对子阵列的引用:
$sub = $super["second"];
如何从子数组中引用超级数组?
我正在寻找一种方法来做这样的事情:
var_dump($sub[../"first"]);
数组(大小= 2) 0 =>字符串'first1'(长度= 6) 1 =>字符串'first2'(长度= 6)
答案 0 :(得分:2)
不,PHP Arrays被实现为有序的哈希映射。这意味着数组中的每个键都会进行哈希处理并直接映射到值。那个值可能是另一个数组,当然,但地图不会相反。因此,值无法映射回PHP中的键或任何典型散列映射的实现。哈希仅以单向。
因此,在$arr = ["foo" => ["bar"]]
中,数组"foo"
中的键$arr
将映射到值["bar"]
,这恰好是另一个数组。但是没有办法以相反的顺序(即将值["bar"]
映射回"foo"
中的键$arr
)。
如果你想要这种 co-recursive 关系,比如树或图,它实际上更容易用对象完成,因为对象不具备相同的数组所做的按值复制语义。
$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" }
现在,如果您更改$first
或$obj
的值,实际上并不重要。对象保持不变,因为PHP对象不直接存储在变量中。它们存储在一个容器中,该容器从用户区抽象出来,变量只保存对该容器的引用。因此$first
和$obj
仍指向同一个对象。
继续上面的例子,如果我们尝试这样的事情......
$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!" }
答案 1 :(得分:0)
通过创建自定义函数,您只能知道索引的父索引是什么:
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;
}