【问题标题】:PHP: Using a string 'address' of a value in an array get the valuePHP:使用数组中值的字符串“地址”获取值
【发布时间】:2011-09-28 15:23:48
【问题描述】:

我有一个 person 数组,其中的键为“n”。 'n' 的值是一个数组,键 'l'('last' 的缩写)具有我想要获取的值,即姓氏。

出于好奇的编程原因,我将姓氏的“地址”作为字符串

我该怎么做?
我试过 eval 等等。

对不起,我没有说清楚!

我想要的是使用变量 $test 来获取它。

例如类似:

$person[$test]

(这显然行不通,但什么行?)

$test 并不总是“两深”。例如。有时会是['a']['residential']['street']

<?php

    $test = "['n']['l']";

    echo "I've got a string with the array index ".$test. "\n";

    $person = array("n"=>array('l'=>'SMITH'));

    echo 'the array, $person, is this: '."\n";
    print_r($person);

    echo "What I want is ".$person['n']['l']. "\n";
    ?>

输出:

我有一个数组索引为 ['n']['l'] 的字符串 数组 $person 是这样的: 大批 ( [n] => 数组 ( [l] => 史密斯 ) )

我想要的是史密斯

【问题讨论】:

  • 我不完全确定您的问题是什么。您表明您可以访问 $person['n']['l'],但似乎这是您的问题。
  • 你已经这样做了,怎么了?
  • 我不清楚你的问题,但我绝对不想在回显中显示数组的内容,但你必须使用 print_r() php.net/manual/en/function.print-r.php
  • 我猜 op 想使用$test 变量来获取数组位置,而不是在echo ... $person['n']['l'] 部分使用静态['n']['l']
  • 删除了 mongodb 标签,因为它与这个问题无关(即使那是数据的来源)。

标签: php arrays string indexing


【解决方案1】:
$index1 = $test[2];    
$index2 = $test[7];

echo $person[$index1][$index2];

【讨论】:

  • 显然,这是因为他的字符串始终具有相同的结构和不同的索引名称,否则我怀疑有办法做到这一点......
  • 他可以使用正则表达式。
  • 正则表达式会有类似的问题。我假设 $person 数组的结构始终相同,$test 字符串也是如此(始终 ['index_1']['index_2'])。我宁愿问这样的问题,这样做有什么意义,为什么索引会改变等等?
【解决方案2】:

我相信这将使这项工作按您期望的方式工作:

这将输出 SMITH - 请参阅 http://codepad.org/M3jRDg99

eval("echo \$person$test;");

我认为它对您不起作用的原因可能与转义美元符号有关。

【讨论】:

  • 谢谢,成功了!要在 eval 中分配一个变量,我只是这样做了:eval("\$foo= \$person$test;");
  • @Dan 请注意,使用 eval 时应该非常小心。最好不要使用它。
【解决方案3】:

你几乎只有两个选择:

使用eval

function IAmEvilSoYouShouldNotCallMe($array, $key) {
    return eval('return $array' . $key . ';');
}

echo IAmEvilSoYouShouldNotCallMe(
    array("n"=>array('l'=>'SMITH')),
    "['n']['l']"
);

或字符串解析:

function helper($array, $key) {
    $keys = array_map(function ($val) {
        return trim($val, "]['");
    }, explode('][', $key));    

    while ($key = array_shift($keys)) {
        if (isset($array[$key])) {
            $array = $array[$key];
            continue;
        }

        return null;
    }

    return $array;
}

echo helper(
    array("n"=>array('l'=>'SMITH')),
    "['n']['l']"
);

两个输出:

SMITH

【讨论】:

  • 我最终选择了这条路线,所以我不必使用 eval。
【解决方案4】:

我看不出在这种情况下使用数组的正当理由,你只会让你的编码生活变得复杂。你需要学习的是面向对象编程(OOP)。

那么您只需要创建一个包含 Person 对象数组的 People 对象。

在最简单的形式中,您只需使用

People->listOfPersons[0]->fullName->familyName 

使用 getter 和 setter 甚至更好:

People->getNextPerson()->getFamilyName()

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    相关资源
    最近更新 更多