我有以下数组:
$array1 = array("X", "Y", "Z")
$array1
的数组值是另一个数组的键。我想要像这样访问该元素:
$array2["X"]["Y"]["Z"]
我对如何做到这一点有任何想法?
答案 0 :(得分:2)
首先,我们会将$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
。我们这样做只是检查$tmp
是否不再是一个数组,并且没有被一个未找到的键“卡住”。
<?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";
?>
答案 1 :(得分:0)
您可以使用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));