使用数组值作为另一个数组的键

时间:2016-05-14 08:46:26

标签: php arrays

我有以下数组:

$array1 = array("X", "Y", "Z")

$array1的数组值是另一个数组的键。我想要像这样访问该元素:

$array2["X"]["Y"]["Z"]

我对如何做到这一点有任何想法?

2 个答案:

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

示例:https://eval.in/571509