【问题标题】:Convert PHP array string into an array将 PHP 数组字符串转换为数组
【发布时间】:2010-10-15 15:13:48
【问题描述】:

我有一个数组:

$myArray = array('key1'=>'value1', 'key2'=>'value2');

我把它保存为变量:

$fileContents = var_dump($myArray);

如何将变量转换回用作常规数组?

echo $fileContents[0]; //output: value1
echo $fileContents[1]; //output: value2

【问题讨论】:

标签: php arrays serialization


【解决方案1】:

我想你可能想看看serializeunserialize

$myArray = array('key1'=>'value1', 'key2'=>'value2');
$serialized = serialize($myArray);
$myNewArray = unserialize($serialized);
print_r($myNewArray); // Array ( [key1] => value1 [key2] => value2 ) 

【讨论】:

  • 但这不是问题的答案。
  • 您的解决方案不包括将 var_dump() 输出恢复为数组(这是问题所在)。这只是完成数组序列化和反序列化的另一种方式。
  • @marines:如果你想从字面上理解这个问题,我想这是真的。很明显,OP 只是在寻找一种将数组保存为字符串然后将其带回的方法,因此即使问题没有指定它,序列化也是他的 problem 的正确答案。你永远不会故意用 var_dump() 做他想做的事情,所以这不是问题。
  • @Paolo Bergantino:我收到了来自远程在线服务的回复,该服务将结果显示为数组的字符串表示形式。如何将其还原回数组???
  • 实际上@marines,OP 确实指定了它:他给出了 var_dump() 的示例,它无法通过反序列化恢复正常。他正在寻找一种方法来对 var_dump() 进行逆向工程,以从中创建一个可用的数组。
【解决方案2】:

序列化可能是正确的答案 - 但我更喜欢使用 JSON - 这样就可以对数据进行人工编辑...

$myArray = array('key1'=>'value1', 'key2'=>'value2');
$serialized = json_encode($myArray);
$myNewArray = json_decode($serialized, true);
print_r($myNewArray); // Array ( [key1] => value1 [key2] => value2 )

【讨论】:

  • +1,我不知道为什么我一开始没有想到。这也是我个人使用的。
  • +1 用于 JSON。注意:json_decode() 函数需要第二个参数为“true”才能返回关联数组! (或者它会返回一个“stdClass”对象)
【解决方案3】:

尝试使用var_export 生成有效的 PHP 语法,将其写入文件,然后“包含”该文件:

$myArray = array('key1'=>'value1', 'key2'=>'value2');
$fileContents = '<?php $myArray = '.var_export($myArray, true).'; ?>';

// ... after writing $fileContents to 'myFile.php'

include 'myFile.php';
echo $myArray['key1']; // Output: value1

【讨论】:

  • 每个人都应该忘记使用 $myArray 作为此处任何示例的源。 OP 明确表示他想从它的转储开始,而不是实际的数组。他有一个带有转储的字符串,而不是数组。他不想生成字符串。
【解决方案4】:
$array = ['10', "[1,2,3]", "[1,['4','5','6'],3]"];

function flat($array, &$return) {
    if (is_array($array)) {
        array_walk_recursive($array, function($a) use (&$return) { flat($a, $return); });
    } else if (is_string($array) && stripos($array, '[') !== false) {
        $array = explode(',', trim($array, "[]"));
        flat($array, $return);
    } else {
        $return[] = $array;
    }
}

$return = array();

flat($array, $return);

print_r($return);

输出

数组 ( [0] => 10 [1] => 1 [2] => 2 [3] => 3 [4] => 1 [5] => '4' [6] => '5' [7 ] => '6'] [8] => 3)

【讨论】:

    【解决方案5】:

    评估呢?您还应该使用返回变量为 true 的 var_export 而不是 var_dump。

    $myArray = array('key1'=>'value1', 'key2'=>'value2');
    $fileContents = var_export($myArray, true);
    eval("\$fileContentsArr = $fileContents;");
    echo $fileContentsArr['key1']; //output: value1
    echo $fileContentsArr['key2']; //output: value2
    

    【讨论】:

    • 另一个使用 $myArray 的例子,当 OP 声明他想使用它的 var_dump() 时。不是数组。就我们而言,数组可能已经消失了,他只是为了让我们知道转储是什么而提到它。
    【解决方案6】:

    免责声明

    我写了这个函数(出于乐趣:),因为我很懒,所以我想要一种将字符串中的数组转换为有效 PHP 数组的简单方法。 我不确定这段代码在生产环境中是否 100% 安全使用exec,它的姐妹们总是把我吓坏了。

    $myArray = 'array("key1"=>"value1", "key2"=>"value2")';
    
    function str_array_to_php(string $str_array) {
        // No new line characters and no single quotes are allowed
        $valid_str = str_replace(['\n', '\''], ['', '"'], $str_array);
        exec("php -r '
        if (is_array($valid_str)) {
            function stap(\$arr = $valid_str) {
                foreach(\$arr as \$v) {
                    if(is_array(\$v)){
                        stap(\$v);
                    }
                    else {
                        echo \$v,PHP_EOL;
                    }
                }
            }
            stap();
        }'2>&1", $out);
            return $out;
    }
    
    print_r(str_array_to_php($myArray));
    

    输出:

    Array ( [0] => value1 [1] => value2 ) 
    

    如您所见,它将$myArray 转换为有效的PHP 数组,然后对其进行数字索引,如果它是多维的,则将其转换为单个数组。

    小心:

    1- 永远不要在双引号中传递数组,因为这将允许计算空字节字符 (\0)。

    例如:

    $myArray = "array(\"key1\"=>\"value\n\0 ggg\", \"key2\"=>\"value2\")"
    //Output: Warning: exec(): NULL byte detected. Possible attack
    

    2- 如果exec 被禁用,此功能将不起作用(大多数情况下)

    3- 如果未设置php 命令,此功能将不起作用

    最后一件事,如果您发现任何错误或缺陷,请在 cmets 中告诉我,以便我修复和学习。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 2018-01-29
      • 2013-08-12
      • 2021-12-27
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多