Экспорт данных в XML - сбой десериализации массива из-за ошибки - PullRequest
0 голосов
/ 27 мая 2019

Я бы хотел экспортировать массив woocommerce "redq_day_ranges_cost" в формат XML с WP All Export. Если я пытаюсь десериализовать массив, я сталкиваюсь с этой ошибкой PHP: unserialize (): ошибка со смещением ...

Я пробовал вещи, упомянутые здесь: Как восстановить сериализованную строку, которая была повреждена из-за неправильной длины счета байтов?

Проблема в том, что 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 Ответ

1 голос
/ 27 мая 2019

У вас есть две проблемы с вашими данными, во-первых, в них есть новые строки, которые необходимо удалить, и во-вторых, что некоторые из ваших строковых переменных имеют несоответствующие длины.Первое можно исправить с помощью простого str_replace;последнее можно исправить, используя код в этом ответе .Этот код будет работать для преобразования вашей строки обратно в массив:

$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
  )
)

Демонстрация на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...