将数据导出到XML-由于错误

时间:2019-05-26 23:55:01

标签: php arrays serialization

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

我尝试了这里提到的事情: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>

到目前为止,如果我在函数编辑器中调用unserialize,则结果为命名错误。如果我在XML编辑器中内联调用它,则会导致3行

<redq_day_ranges_cost>Array</redq_day_ranges_cost>

1 个答案:

答案 0 :(得分: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