将字符串转换为数组PHP

时间:2011-07-23 18:24:12

标签: php arrays string php-5.3

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

  

“'middle_initial'=>'','sid'=>'1419843','fixed'=>'Y',   'cart_weight'=> '0','key'=> 'ABCD','州'=> 'XX','last_name'   => 'MNOP','email'=> 'abc@example.com','city'=> '伦敦',   'street_address'=> 'Sample','first_name'=> 'Sparsh',“

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

4 个答案:

答案 0 :(得分:6)

首先使用explode()函数展开字符串,使用', '作为分隔符:

$str = "'middle_initial' => '', 'sid' => '1419843', 'fixed' => 'Y', 'cart_weight' => '0', 'key' => 'ABCD', 'state' => 'XX', 'last_name' => 'MNOP', 'email' => 'abc@example.com', '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)
  ...


然后,迭代该列表,匹配=>每一侧的每个项目,并使用=>的第一面作为结果数据的关键,第二面作为值:< / p>

$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 :(得分:1)

虽然我完全同意Pascal Martin的意见,但如果您有这样的数据需要处理,以下(如Pascal的第一个建议所提到的)可能会根据您的实际内容而有效。但是,请帮自己一个忙,并将数据存储为可以可靠地放回PHP数组的格式(序列化,JSON,CSV等)。

<pre>
<?php

$str = "\" 'middle_initial' => '', 'sid' => '1419843', 'fixed' => 'Y', 'cart_weight' => '0', 'key' => 'ABCD', 'state' => 'XX', 'last_name' => 'MNOP', 'email' => 'abc@example.com', '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关于', '标记的建议)。

答案 2 :(得分:0)

使用SerializeUnserialize代替var_dump会更好,更容易。

以这种形式,也许你可以试试

explode(' => ', $string)

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

答案 3 :(得分:-1)

只要是print_r和数组的输出,就可以使用我的小print_r converter,PHP源代码随链接一起提供。

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

您可以在我的个人资料页面找到最新版本。