我有以下数组:
$array1 = array("X", "Y", "Z")
$array1
的数组值是另一个数组的键。我想访问这样的元素:
$array2["X"]["Y"]["Z"]
你知道我该怎么做吗?
说明
首先,我们将把$array1
和$array2
分配给其他变量,因为我们要修改和使用它们。以防以后需要原始数组。我们将第一个数组(第二个数组的键)分配给变量$keys
。和第二个阵列到$tmp
:
$keys = $array1;
$tmp = $array2;
然后,我们将使用while循环来循环键,并始终使用array_shift()
:将第一个元素从数组中下移
while($key = array_shift($keys)){
}
在我的例子中,这意味着:
iteration 1: $key = A
iteration 2: $key = B
iteration 3: $key = C
正如我之前所说,我们将第二个数组分配给$tmp
。这意味着:
$array2 = ["A" => ["B" => ["C" => "RESULT"]]];
$tmp = $array2;
//$tmp = ["A" => ["B" => ["C" => "RESULT"]]];
现在我们开始循环并检查$key
是否存在于我们的$tmp
变量中。如果是,我们将该元素分配回$tmp
,并在下一个键上循环,然后执行同样的操作。如果在任何时候密钥不存在,我们可以打破循环。
可视化:
iteration 1:
key = A
tmp = ["A" => ["B" => ["C" => "RESULT"]]]
tmp[A] = EXISTS TRUE
TRUE -> tmp = tmp[A] //tmp = ["B" => ["C" => "RESULT"]]
FALSE -> break
iteration 2:
key = B
tmp = ["B" => ["C" => "RESULT"]]
tmp[B] = EXISTS TRUE
TRUE -> tmp = tmp[B] //tmp = ["C" => "RESULT"]
FALSE -> break
iteration 3:
key = C
tmp = ["C" => "RESULT"]
tmp[C] = EXISTS TRUE
TRUE -> tmp = tmp[C] //tmp = "RESULT"
FALSE -> break
tmp = "RESULT"
现在,在最后,我们当然必须检查是否所有这些密钥都存在,并且我们在$tmp
中得到了结果。我们只是通过检查CCD_ 12是否不再是一个数组;"卡住";找不到钥匙。
代码
<?php
$array1 = ["A", "B", "C"];
$array2 = ["A" => ["B" => ["C" => "RESULT"]]];
$keys = $array1;
$tmp = $array2;
while($key = array_shift($keys)){
if(isset($tmp[$key]))
$tmp = $tmp[$key];
else
break;
}
if(!is_array($tmp))
echo $tmp;
else
echo "Element does not exist";
?>
您可以循环使用keys数组,检查源数组中是否存在keys,并将它们存储到一个新数组中。
最后,当keys循环结束时,您将在新数组中留下结果。
$array1 = array("X","Y","Z");
$array2 = array('X' => array('Y' => array('Z' => array('A' => 'B'))));
function getValue($keys, $source){
$ref = $source;
foreach($keys as $key) {
if(isset($ref[$key])) $ref = $ref[$key];
else return false;
}
return $ref;
}
print_r(getValue($array1, $array2));
示例:https://eval.in/571509