gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:44:41 26 4
gpt4 key购买 nike

问题

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

  1. 反序列化该列的每个字符串(位于其自己的单元格中)
  2. 以某种方式输出它,使文本的格式与此类似:
    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"";}

问题

  1. 是否可以循环遍历序列化数据,然后反序列化并以所需格式显示(例如以 HTML table 格式)?

注意:尽管此序列化数据来自 MySQL 数据库,但如果可能,我宁愿不必连接到数据库以再次检索此序列化数据。

尝试的解决方案

到目前为止,我有:

  1. 查看 php 文档 http://php.net/manual/en/function.unserialize.php
  2. 查看 Stack Overflow 上的代码示例
  3. 使用过这样的工具 http://unserialize.onlinephpfunctions.com/查看如何使用此功能
  4. 尝试实现我自己的代码(见下文)

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

  1. 一个循环(循环遍历序列化数据)
  2. var_exportvar_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

尝试的解决方案

我创建了一个只有 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 的代码结合起来,但没有成功(例如,将 unserialize 代码添加到循环中)。

问题:

  1. 我阅读了 the PHP fgetscsv manual 的评论如果你是 mac 用户(我就是),你需要添加 auto_detect_line_endings进入你的代码。我试过了,没有发现任何区别。这可能是问题的一部分吗?
  2. fclose($fp); 的位置@geoffrey 的代码和我上面粘贴的代码都不同。尝试在我的代码/循环的不同行/区域中使用它,但没有成功。这是我在使用 unserialized 时什么也没看到的部分原因吗?在我的代码中?
  3. 有什么我可能遗漏的吗?

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

更新 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 格式指定其他参数。

关于php - 如何使用循环反序列化多个数据字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54290900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com