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


Use array values as keys of another array

我有以下数组:

$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