数组是否可以知道其父类?

时间:2016-08-31 21:48:21

标签: php

考虑这个数组:

$super = [
  "first"  => ["first1","first2"],
  "second" => ["second1","second2"]
];

现在让我们抓住对子阵列的引用:

$sub = $super["second"];

如何从子数组中引用超级数组?

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

var_dump($sub[../"first"]);
  

数组(大小= 2)     0 =>字符串'first1'(长度= 6)     1 =>字符串'first2'(长度= 6)

2 个答案:

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