微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 如何使用循环反序列化多个数据字符串?

问题

我有一个大的csv文件,我从mysql数据库导出.其中一个文件列中包含序列化字符串.我正试图找到一种方法

>对列的每个字符串(它们位于自己的单元格中)进行反序列化
>以某种方式输出它,使文本格式与此类似:

    array (
  'weight' => '108 lbs', 'ah' => '24"', 'sw' => '50"', 'sdw' => '23"', 'shw' => '18"', 'sd' => '27"', 'sh' => '12"',
)

以下是未序列化行的示例(其中大约有1000行):

    a:7:{s:6:"weight";s:6:"30 lbs";s:2:"ah";s:3:"26"";s:2:"sw";s:3:"20"";s:3:"sdw";s:0:"";s:3:"shw";s:3:"19"";s:2:"sd";s:3:"19"";s:2:"sh";s:3:"17"";}

    a:7:{s:6:"weight";s:7:"107 lbs";s:2:"ah";s:3:"26"";s:2:"sw";s:3:"72"";s:3:"sdw";s:3:"23"";s:3:"shw";s:3:"18"";s:2:"sd";s:3:"27"";s:2:"sh";s:3:"12"";}

    a:7:{s:6:"weight";s:6:"37 lbs";s:2:"ah";s:0:"";s:2:"sw";s:0:"";s:3:"sdw";s:0:"";s:3:"shw";s:0:"";s:2:"sd";s:0:"";s:2:"sh";s:0:"";}

    a:7:{s:6:"weight";s:6:"66 lbs";s:2:"ah";s:3:"26"";s:2:"sw";s:3:"50"";s:3:"sdw";s:3:"23"";s:3:"shw";s:3:"18"";s:2:"sd";s:3:"27"";s:2:"sh";s:3:"12"";}

    a:7:{s:6:"weight";s:6:"30 lbs";s:2:"ah";s:0:"";s:2:"sw";s:3:"26"";s:3:"sdw";s:0:"";s:3:"shw";s:3:"18"";s:2:"sd";s:3:"39"";s:2:"sh";s:3:"12"";}

问题

>是否可以循环遍历序列化数据,然后对其进行反序列化并以所需格式显示(例如以HTML表格格式)?

注意:虽然这个序列化数据来自MysqL数据库,但如果可能的话,我宁愿不必挂钩数据库再次检索这个序列化数据.

试图解决方

到目前为止,我有

>查看了PHP文档http://php.net/manual/en/function.unserialize.php
>查看Stack Overflow上的代码示例

> How to use php serialize() and unserialize()
> How to get each value of unserialized data

>使用此工具如http://unserialize.onlinephpfunctions.com/,了解如何使用此功能
>试图实现我自己的代码(见下文)

在阅读了主题/问题后,我知道我可能需要使用:

>一个循环(循环遍历序列化数据)
> var_export或var_dump以所需格式显示内容

代码示例

这是我用来获得上述结果的代码

    <?PHP 

  $var1='a:7{s:6:"weight";s:7:"105lbs";s:2:"ah";s:3:"23"";s:2:"sw";s:3:"26"";s:3:"sdw";s:0:"";s:3:"shw";s:3:"17"";s:2:"sd";s:3:"80"";s:2:"sh";s:3:"12"";}';
    $var2='a:7:{s:6:"weight";s:7:"108 lbs";s:2:"ah";s:3:"24"";s:2:"sw";s:3:"50"";s:3:"sdw";s:3:"23"";s:3:"shw";s:3:"18"";s:2:"sd";s:3:"27"";s:2:"sh";s:3:"12"";}';

    $combined = unserialize($var2);
    $combined2 = unserialize($var1);

    print_r($combined);
    print_r($combined2);

    ?>

虽然我没有得到所需的输出,但我能够在屏幕上显示一些非序列化数据:

    Array ( [weight] => 108 lbs [ah] => 24" [sw] => 50" [sdw] => 23" [shw] => 18" [sd] => 27" [sh] => 12" ) Array ( [weight] => 105 lbs [ah] => 23" [sw] => 26" [sdw] => [shw] => 17" [sd] => 80" [sh] => 12" )

这是进步,但它有问题,因为它不是循环(手动输入)并且缺少HTML标记以便以后更容易格式化.

任何有关这方面的见解将不胜感激.提前致谢!

更新1

试图解决方

我创建了一个只有一列和10行的临时CSV文件.请参阅CSV文件here.

我试图使用代码@geoffry共享,但它似乎没有从我的csv文件提取任何信息.我得到了一个无限循环(1000个< tr>标签出现在控制台中(但没有来自csv文件内容).

fgetscsv指向正确的方向后,我找到了下面的代码.使用此代码,我能够以列表形式将列放到页面上,因此我确信文件正在正确打开.但是这个循环省略了反序列化步骤,这在这里更为重要.

<?PHP

$filename = "myfilename.csv"; 

$id = fopen($filename, "r"); 
while ($data = fgetcsv($id, filesize($filename))) 
$table[] = $data; 
fclose($id);

echo "<table>\n";

foreach($table as $row)
{
echo "<tr>";
    foreach($row as $data)
    echo "<td>$data</td>";
echo "</tr>\n";
}

echo "</table>\n";

?>

我尝试将下面的代码和@geoffrey的代码的各个方面结合起来没有运气(例如,在循环中添加反序列化代码).

问题:

>我在the PHP fgetscsv manual评论中读到,如果你是一个mac用户(我是),你需要在你的代码添加auto_detect_line_endings.我试过这个并没有注意到任何区别.这可能是问题的一部分吗?
> fclose($fp)的位置; @geoffrey的代码和上面粘贴的代码都不同.尝试在我的代码/循环的不同行/区域中使用它而没有运气.这是我在代码中使用反序列化时没有看到任何内容的部分原因吗?
>我可能遗失的任何东西?

再次感谢您的任何见解.非常感激!

更新2

我能够使用名为maybe_unserialize的辅助函数来反序列化序列化数据.虽然我无法遍历所有代码,但这是朝着正确方向迈出的一步,能够使用PHP获得非序列化数组.

代码示例

<?PHP 

$original = array(
    'a:7:{s:6:"weight";s:7:"149 lbs";s:2:"ah";s:3:"24"";s:2:"sw";s:3:"75"";s:3:"sdw";s:3:"23"";s:3:"shw";s:3:"18"";s:2:"sd";s:3:"27"";s:2:"sh";s:3:"12"";}'
);

$string = implode(", ", $original);
$done = maybe_unserialize($string);
var_export($done);

 ?>

希望这有助于其他任何有类似问题的人!

解决方法:

由于您正在处理CSV,我将假设您要读取文件并迭代您希望反序列化的数据位于第5列的每一行.我还假设所需的HTML输出格式,这应该是应该的让你在路上.

<table>
<?PHP
  $fp = fopen('file.csv', 'r');
  while(($row = fgetcsv($fp)) !== false)
  {
    echo "<tr>";
    $data = unserialize($row[5]);
    foreach($data as $name => $value)
    {
      echo "<td>" . htmlspecialchars($name ) . "</td>";
      echo "<td>" . htmlspecialchars($value) . "</td>";
    }
    echo "</tr>";
  }
  fclose($fp);
?>
</table>

您可能需要查看fgetcsv上的文档,因为您可能需要根据CSV格式指定其他参数.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐