【问题标题】:Exporting data to XML - unserialize array fails due to error将数据导出到 XML - 由于错误,反序列化数组失败
【发布时间】:2019-05-26 23:55:01
【问题描述】:

我想使用 WP All Export 将 woocommerce 数组“redq_day_ranges_cost”导出为 XML 格式。如果我尝试反序列化数组,我会遇到这个 PHP 错误:unserialize(): Error at offset...

我尝试了这里提到的东西:How to repair a serialized string which has been corrupted by an incorrect byte count length?

问题是,由于该错误,WP All Export 已经无法保存导出模板,所以我在这里感到有些失落。

这是要导出的数据:

a:7:{
i:0;a:4
{s:8:"min_days";s:1:"1";s:8:"max_days";s:1:"1";s:10:"range_cost";s:2:"340";s:15:"cost_applicable";s:5:"fixed";}
i:1;a:4:
{s:8:"min_days";s:1:"2";s:8:"max_days";s:1:"2";s:10:"range_cost";s:2:"450";s:15:"cost_applicable";s:5:"fixed";}
i:2;a:4:
{s:8:"min_days";s:1:"3";s:8:"max_days";s:1:"3";s:10:"range_cost";s:2:"570";s:15:"cost_applicable";s:5:"fixed";}}

计划是将其导出为类似的东西

<min_days>1</min_days>
<max_days>1</max_days>
<range_cost>340</range_cost>
<cost_applicable>fixed</cost_applicable>

到目前为止,如果我在函数编辑器中调用反序列化,结果就是命名错误。如果我在 XML 编辑器中内联调用它,则会产生 3 行

&lt;redq_day_ranges_cost&gt;Array&lt;/redq_day_ranges_cost&gt;

【问题讨论】:

    标签: php arrays serialization


    【解决方案1】:

    您的数据有两个问题,第一个是其中包含需要删除的换行符,第二个是您的某些字符串变量的长度不匹配。前者可以用一个简单的str_replace来纠正;后者可以使用this answer 中的代码进行更正。此代码可将您的字符串转换回数组:

    $data = str_replace("\n", "", $data);
    $fixed_data = preg_replace_callback ( '!s:(\d+):"(.*?)";!', function($match) {      
        return ($match[1] == strlen($match[2])) ? $match[0] : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
    }, $data );
    
    print_r(unserialize($fixed_data));
    

    输出:

    Array ( 
      [0] => Array (
        [min_days] => 1
        [max_days] => 1
        [range_cost] => 340
        [cost_applicable] => fixed
      )
      [1] => Array (
        [min_days] => 2
        [max_days] => 2
        [range_cost] => 450
        [cost_applicable] => fixed
      )
      [2] => Array (
        [min_days] => 3
        [max_days] => 3
        [range_cost] => 570
        [cost_applicable] => fixed
      )
    )
    

    Demo on 3v4l.org

    【讨论】:

    • 我添加了 \n 只是为了使它在此处更具可读性。关于不匹配,我已修复,谢谢您提及。问题是,WP All Import 的功能编辑器在保存“导出模板”时仍然失败,所以我认为数据肯定有其他问题。
    • @achiever 啊,对不起,我根本没有帮助。我建议将 wordpress 标签添加到您的问题中,希望它可能会引起在该领域有更多知识的人的关注。但是,你不能在函数编辑器中添加对preg_replace_callback的调用insideunserialize的调用吗? unserialize(preg_replace_callback(...))?
    • 不,这正是我需要弄清楚的。这不是代码或数据的问题,它只是在保存 XML 模板时引发错误。该函数本身运行正常,我现在可以获取导出的数据。谢谢你:)
    • @achiever 只要你开心。如果答案并没有真正解决您的问题,则没有理由接受。
    • 我在表示中的长度不匹配,所以你解决了我的问题。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多