解析 var_export 输出文本以填充关联数组

问题描述 投票:0回答:4

不久前,我通过一些 API 获取了大量数据,并将其保存到一个平面文件中,执行简单的 var_dump 或 print_r。现在我正在处理数据,每行看起来像:

" 'middle_initial' => '', 'sid' => '1419843', '固定' => 'Y', 'cart_weight' => '0', 'key' => 'ABCD', 'state' => 'XX', 'last_name' => 'MNOP', '电子邮件' => '[电子邮件受保护]', '城市' => '伦敦', 'street_address' => '样本', 'first_name' => 'Sparsh',"

现在我需要将这些数据恢复为数组格式。我有办法做到吗?

php arrays string text-parsing php-5.3
4个回答
6
投票

首先使用

explode()
函数分解字符串,并使用
', '
作为分隔符:

$str = "'middle_initial' => '', 'sid' => '1419843', 'fixed' => 'Y', 'cart_weight' => '0', 'key' => 'ABCD', 'state' => 'XX', 'last_name' => 'MNOP', 'email' => '[email protected]', 'city' => 'London', 'street_address' => 'Sample', 'first_name' => 'Sparsh',";
$items = explode(', ', $str);
var_dump($items);

这会让你得到一个看起来像这样的数组:

array
  0 => string ''middle_initial' => ''' (length=22)
  1 => string ''sid' => '1419843'' (length=18)
  2 => string ''fixed' => 'Y'' (length=14)
  3 => string ''cart_weight' => '0'' (length=20)
  ...


然后,迭代该列表,匹配

=>
每一侧的每个项目,并使用
=>
的第一侧作为结果数据的键,第二侧作为值:

$result = array();
foreach ($items as $item) {
    if (preg_match("/'(.*?)' => '(.*?)'/", $item, $matches)) {
        $result[ $matches[1] ] = $matches[2];
    }
}
var_dump($result);

这会让你:

array
  'middle_initial' => string '' (length=0)
  'sid' => string '1419843' (length=7)
  'fixed' => string 'Y' (length=1)
  'cart_weight' => string '0' (length=1)
  ...


但是,说真的,您不应该以如此糟糕的格式存储数据:

print_r()
是为了显示数据而设计的,用于调试目的——而不是存储它并稍后重新加载!

如果要将数据存储到文本文件,请使用

serialize()
json_encode()
,都可以分别使用
unserialize()
json_decode()
恢复。


1
投票

虽然我完全同意帕斯卡·马丁的观点,但如果您有此类数据要处理,则以下内容(如帕斯卡的第一个建议提到的)可以根据您的实际内容起作用。不过,请帮自己一个忙,以一种可以可靠地放回 PHP 数组的格式存储数据(序列化、JSON、CSV 等)。

<pre>
<?php

$str = "\" 'middle_initial' => '', 'sid' => '1419843', 'fixed' => 'Y', 'cart_weight' => '0', 'key' => 'ABCD', 'state' => 'XX', 'last_name' => 'MNOP', 'email' => '[email protected]', 'city' => 'London', 'street_address' => 'Sample', 'first_name' => 'Sparsh',\"";

function myStringToArray($str) {
    $str = substr($str, 1, strlen(substr($str, 0, strlen($str)-2)));
    $str = str_replace("'",'',$str);
    $strs = explode(',', $str);
    $arr = array();
    $c_strs = count($strs);
    for ($i = 0; $i < $c_strs; $i++) {
        if (strpos($strs[$i],'=>') !== false) {
            $_arr = explode('=>',$strs[$i]);
            $arr[trim($_arr[0])] = trim($_arr[1]);
        }
    }
    return $arr;
}

print_r(myStringToArray($str));

?>
</pre>

http://jfcoder.com/test/substr.php

注意,如果数组成员的内容中有逗号(例如,使用 Pascal 关于

', '
标记的建议),则需要调整函数。


0
投票

使用 SerializeUnserialize 而不是 var_dump 会更好、更容易。

以这种形式,也许你可以尝试一下

explode(' => ', $string)

然后遍历数组并将这些对放在一个新数组中。


-1
投票

只要是

print_r
的输出和一个数组,你就可以使用我的小print_r转换器,PHP源代码可以通过链接获得。

分词器基于正则表达式,因此您可以根据需要采用它。解析器负责形成 PHP 数组值。

您将在我的个人资料页面上找到最新版本的链接。

© www.soinside.com 2019 - 2024. All rights reserved.