将字符串转换为数组 PHP

3
不久前,我通过某个API获取了大量数据,并将其保存到一个平面文件中,使用简单的var_dump或print_r。现在我想处理这些数据,每行看起来像这样:
" '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',
现在我需要将这些数据重新转换为数组格式。有没有办法可以做到这一点?

如果这只是一次性的事情,你可以将它复制并粘贴到一个文件中然后让 PHP 解析它。否则,你可能需要考虑使用 eval(),但如果你真的要使用它,一定要非常小心。 - Brad
如果您可以再次从API中获取数据,那么显而易见的解决方案是修改保存过程以将数组“序列化(serialize())”,然后只需获取文件的文本并执行“unserialize($text)”。 - prodigitalson
4个回答

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)
  ...


然后,遍历该列表,对于列表中的每个项目进行匹配,将=>两侧的内容分别作为结果数据的键和值:

$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() 进行还原。


3
我刚刚意识到:这个回答是我在stackoverflow上的第3000个回答;-) - Pascal MARTIN

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关于', '令牌的建议),则需要调整该函数。

0

使用序列化反序列化比使用var_dump更好、更容易。

以那种形式,也许你可以尝试一个

explode(' => ', $string)

然后遍历数组并将成对的元素放入新数组中。


-1
只要是print_r的输出和一个数组,你就可以使用我的小print_r转换器,PHP源代码可以通过链接获得。
分词器基于正则表达式,因此您可以根据自己的需要进行调整。解析器处理形成PHP数组值的过程。
您可以在我的个人资料页面上找到最新版本的链接。

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