将PHP数组字符串转换为数组

17

我有一个数组:

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

我将其保存在一个变量中:

$fileContents = var_dump($myArray);
如何将变量转换为常规数组以便后续使用?
echo $fileContents[0]; //output: value1
echo $fileContents[1]; //output: value2

如果您使用print_r而不是var_dump,则可以使用print_r反转函数 - machineaddict
6个回答

27

我认为你可能想要了解serializeunserialize

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

3
但这并不是针对问题的答案。 - marines
6
你的解决方案没有涵盖将 var_dump() 输出恢复为数组的情况(这是问题所在)。这只是另一种实现将数组序列化和反序列化的方式。 - marines
5
如果你想按字面意思回答这个问题,我猜那是正确的。很明显,OP只是想找一种将数组保存为字符串并再次复原的方法,所以serialize是他问题的正确答案,即使问题没有明确指定。你绝不会故意使用var_dump()来做他尝试做的事情,所以这就成为了一个非问题。 - Paolo Bergantino
1
@Paolo Bergantino:我从一个远程在线服务得到了响应,它将结果显示为数组的字符串表示形式。我该如何将其转换回数组??? - machineaddict
1
实际上,@marines,OP确实指定了它:他给出了var_dump()的示例,该示例无法通过unserialize恢复。 他正在寻找一种方法来反向工程var_dump(),以使其成为可用的数组。 - sergio

26

“serialize”可能是正确的答案,但我更喜欢使用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,我不知道为什么一开始没想到它。这是我个人也使用的。 - Paolo Bergantino
5
使用JSON,点赞加一。注意:json_decode()函数需要第二个参数为"true"才能返回一个关联数组!否则它会返回一个"stdClass"对象。 - J.C. Inacio

8
尝试使用var_export生成有效的PHP语法,将其写入文件,然后通过'include'命令引入该文件。
$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明确表示他想从它的转储开始,而不是实际数组。他有一个带有转储的字符串,而不是数组。他不想生成字符串。 - sergio

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)

4

那么eval呢?你应该使用var_export,并将返回变量设置为true,而不是使用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,而原帖中提到他想要使用var_dump()。并非数组本身。就我们而言,该数组可能已经不存在,他只是提到它让我们知道转储的内容。 - sergio

3

免责声明

我写了这个函数(只是为了好玩:),而且因为我懒得要死,所以想要一种将字符串中的数组转换为有效PHP数组的简短方法。我不确定这段代码在生产环境中是否百分之百安全可靠,因为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命令,此功能将无法工作。

最后一件事,如果您发现任何错误或缺陷,请在评论中让我知道,以便我可以修复并学习。

希望这有所帮助。


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