我想使用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>
答案 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
)
)