PHP: 使用数组在另一个多维数组中获取值

3
这是一个特定于WordPress的环境,但我的问题更与PHP有关...
我发现自己处于一种奇怪的情况中,需要使用另一个包含正确顺序键序列的数组来获取多维数组中深层的值。
因此,本质上我有一个看起来像这样的数组:
[0] => 'neighborhood' [1] => 'street' [2] => 'house'

最终我需要的是:

get_option( $options_id )['neighborhood']['street']['house']

基本上,我需要通过另一个数组递归下去,从Options数组中获取“house”的值。不能像这样做:
foreach ( $array as $value ) {
    $sequence .= '[' $value ']';
}
get_option( $options_id ) . $sequence;

因为这会将$sequence作为字符串填充值。我尝试使用explode(),但没有任何运气,由于我不是PHP专家,所以我希望有一种明显的答案,但我还没有遇到过。
我知道这是一个奇怪的情况,但任何帮助都将不胜感激!

1
如果你的数组都是这样的,你可以尝试使用getoption($options_id)[$array[0]][$array[1]][$array[2]]。当然,如果这只是一个示例,你需要一些更具动态性的东西,你需要进行大量重构。 - kry
1
可能是[使用字符串访问(可能很大的)多维数组]的重复问题。 (https://stackoverflow.com/questions/7003559/use-strings-to-access-potentially-large-multidimensional-arrays) - CBroe
2个回答

5

您可能希望创建某种辅助函数,其中您迭代路径的部分并跟踪您的临时结果

function deep_array_get(array $path, array $subject) {

   $result = $subject;
   foreach ($path as $p) {
      $result = $result[$p];
   }

   return $result;

}

例子:

$p = ["a", "b", "c"];
$s = [1, 2, "a" => [3, 4, "b" => ["c" => 5]]];
var_dump(deep_array_get($p, $s));

// Result: int(5)

在您的具体应用场景中,它将被使用类似于这样:
$path = ['neighborhood', 'street', 'house'];
$subject = get_option($options_id);

$result = deep_array_get($path, $subject);

我喜欢这个。我会记住它以备其他用途。然而,我不认为这有助于 OP。我不认为他知道 'neighborhood'、'street'、'house' 将是什么,所以他每次迭代都必须设置路径。在我看来,他最好还是坚持使用键分配 0、1、2。但无论如何,我喜欢这个想法。干杯! - Joseph_J
我不明白为什么这不能帮助楼主。这是一种通用的方法,可以使用另一个数组来定义路径从嵌套数组结构中获取值。路径来自哪里并不重要,它可以是静态的 ['neighborhood', 'street', 'house'],也可以是动态生成的其他路径。 - Smuuf
1
帮助可能是错误的词。它确实做到了他需要的事情。我只是从这样一个角度来看待它,即如果数组结构不改变,那么动态设置路径然后馈送一个循环遍历路径以返回结果的函数就没有意义了。当你只需要在一行代码中设置引用即可。如果路径的深度未知,则您的解决方案是正确的选择! - Joseph_J
1
谢谢,这正是我所需要的!你说得对,$path 数组是动态的,实际的键名是未知的,也不知道有多少个。但这个方法解决了我的问题,再次感谢。 - Shoelaced

0

所以如果数组始终具有相同的格式,那么我认为最好的做法就像kry建议的那样。

//Example
$array = [0 => 'neighborhood', 1 => 'street', 2 => 'house'];

$options_id = [1,2,'neighborhood'=>[1,2,3,'street'=>[1,2,3,'house'=>[1,2,3,'myhouse']]]];

$result = $options_id[$array[0]][$array[1]][$array[2]];

print_r($result);

这将输出:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => myhouse
)

你的代码。

$array = [0 => 'neighborhood', 1 => 'street', 2 => 'house'];

//I don't know Wordpress. You can try:
$result = get_option($options_id)[$array[0]][$array[1]][$array[2]]; 

//If that does not work.. Use this.
//$data = get_option($options_id);
//$result = $data[$array[0]][$array[1]][$array[2]];

print_r($result);

我确实考虑过这个问题,但不幸的是键的数组长度可能是任意的,所以我无法知道要计划多少个。不过还是谢谢你的快速回复! - Shoelaced

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接