【问题标题】:Convert a String to Variable将字符串转换为变量
【发布时间】:2010-09-30 19:17:28
【问题描述】:

我有一个多维关联数组,其中包含类似的元素

$data["status"]
$data["response"]["url"]
$data["entry"]["0"]["text"]

我有这样的字符串:

$string = 'data["status"]';
$string = 'data["response"]["url"]';
$string = 'data["entry"]["0"]["text"]';

如何将字符串转换为变量以访问正确的数组元素?此方法需要在任何维度的任何数组上工作。

【问题讨论】:

    标签: php arrays string variables


    【解决方案1】:

    您可以像这样访问它们:

    print $$string;
    

    【讨论】:

    • 你是对的,它不适用于数组。应该测试得更好。
    【解决方案2】:

    又快又脏:

    echo eval('return $'. $string . ';');
    

    当然需要先对输入字符串进行清理。

    如果你不喜欢又快又脏……那么这也可以,而且它不需要 eval,这让我都畏缩了。

    但是,它确实对字符串格式做出了假设:

    <?php
    $data['response'] = array(
        'url' => 'http://www.testing.com'
    );
    
    function extract_data($string) {
        global $data;
    
        $found_matches = preg_match_all('/\[\"([a-z]+)\"\]/', $string, $matches);
        if (!$found_matches) {
                return null;
        }
    
        $current_data = $data;
        foreach ($matches[1] as $name) {
                if (key_exists($name, $current_data)) {
                        $current_data = $current_data[$name];
                } else {
                        return null;
                }
        }
    
        return $current_data;
    } 
    
    echo extract_data('data["response"]["url"]');
    ?>
    

    【讨论】:

    • 多么冗长的替代方案。推荐一个更好、更有用的字符串格式怎么样?
    • 因为这无法回答问题。
    【解决方案3】:

    PHP 的variable variables 将在这里为您提供帮助。您可以通过在变量前加上另一个美元符号来使用它们:

    $foo = "Hello, world!";
    $bar = "foo";
    echo $$bar; // outputs "Hello, world!"
    

    【讨论】:

    • 这为我解决了一个问题;不知道可变变量。谢谢!
    • @Greg:它可能只是掩盖了问题并使情况变得更糟:P
    【解决方案4】:

    Variable variables 页面上找到这个:

    function VariableArray($data, $string) { 
        preg_match_all('/\[([^\]]*)\]/', $string, $arr_matches, PREG_PATTERN_ORDER); 
    
        $return = $arr; 
        foreach($arr_matches[1] as $dimension) { $return = $return[$dimension]; }
    
        return $return; 
    } 
    

    【讨论】:

    • 很确定这不适用于字段名称周围的双引号,如果 $string 无效......我很确定它会崩溃。
    • 正确,我的快速测试表明您需要使用类似:[entry][0][text]
    【解决方案5】:

    我也在为此苦苦挣扎, 我有这个:

    $user  =  array('a'=>'alber', 'b'=>'brad'...);
    
    $array_name = 'user';
    

    我想知道如何进入阿尔伯特。

    一开始我试过

    $value_for_a = $$array_name['a']; // this dosen't work 
    

    然后

    eval('return $'.$array_name['a'].';'); // this dosen't work, maybe the hoster block eval which is very common
    

    然后我终于尝试了愚蠢的事情:

    $array_temp=$$array_name;
    $value_for_a = $array_temp['a'];
    

    这简直完美! 智慧,做简单做傻。

    我希望这能回答你的问题

    【讨论】:

      【解决方案6】:

      这可以通过更简单的方式完成。您所要做的就是考虑 PHP 提供的创建变量的函数。

      $string = 'myvariable';
      extract(array($string => $string));
      echo $myvariable;
      

      完成!

      【讨论】:

        【解决方案7】:

        您可以使用运算符&amp; 通过引用传递。所以在你的例子中你会有这样的东西

        $string = &$data["status"];
        $string = &$data["response"]["url"];
        $string = &$data["entry"]["0"]["text"];
        

        否则你需要这样做:

        $titular = array();
        for ($r = 1; $r < $rooms + 1; $r ++)
        {
            $title = "titular_title_$r";
            $firstName = "titular_firstName_$r";
            $lastName = "titular_lastName_$r";
            $phone = "titular_phone_$r";
            $email = "titular_email_$r";
            $bedType = "bedType_$r";
            $smoker = "smoker_$r";
        
            $titular[] = array(
                "title" => $$title,
                "first_name" => $$firstName,
                "last_name" => $$lastName,
                "phone" => $$phone,
                "email" => $$email,
                "bedType" => $$bedType,
                "smoker" => $$smoker
            );
        }
        

        【讨论】:

          【解决方案8】:

          有用于此的原生 PHP 函数: 使用http://php.net/manual/ru/function.parse-str.php (parse_str())。

          在解析之前不要忘记清理 '"' 中的字符串。

          【讨论】:

            【解决方案9】:

            也许这个选项也合适:

            $data["entry"]["0"]["text"];
            $string = 'data["entry"]["0"]["text"]';
            
            function getIn($arr, $params)
            {
                if(!is_array($arr)) {
                    return null;
                }
                if (array_key_exists($params[0], $arr) && count($params) > 1) {
                    $bf = $params[0];
                    array_shift($params);
                    return getIn($arr[$bf], $params);
                } elseif (array_key_exists($params[0], $arr) && count($params) == 1) {
            
                    return $arr[$params[0]];
                } else {
                    return null;
            }
            }
            
            preg_match_all('/(?:(\w{1,}|\d))/', $string, $arr_matches, PREG_PATTERN_ORDER);
            
            array_shift($arr_matches[0]);
            print_r(getIn($data, $arr_matches[0]));
            

            附:这对我有用。

            【讨论】:

              【解决方案10】:

              您还可以使用花括号(复杂的变量表示法)来做一些技巧:

              $h = 'Happy';
              $n = 'New';
              $y = 'Year';
              $wish = ${$h.$n.$y};
              echo $wish;
              

              【讨论】:

                猜你喜欢
                • 2011-08-27
                • 2010-12-04
                • 2017-10-01
                • 2015-10-27
                • 2020-11-26
                • 1970-01-01
                相关资源
                最近更新 更多