Разделенная табуляцией строка PHP в массив - PullRequest
0 голосов
/ 04 июля 2018

Я использую репозиторий AmazonMwsComplete на GitHub для отправки запросов к Amazon AWS API, в частности к вызову GetReport. Я получаю положительный ответ на мои запросы, поэтому все кажется работающим нормально, единственная проблема заключается в том, что он, по-видимому, преобразует XML-ответ в строку с разделителями табуляции, которую я не могу понять, как правильно отформатировать в массив PHP.

По сути, ответ выглядит примерно так:

string(52148) "sku     asin    price   quantity       Business Price Quantity Price Type        Quantity Lower Bound 1 Quantity Price 1       Quantity Lower Bound 2 Quantity Price 2 Quantity Lower Bound 3 Quantity Price 3       Quantity Lower Bound 4 Quantity Price 4 Quantity Lower Bound 5 Quantity Price 5       ProductTaxCode VatExclusivePrice        VatExclusiveBusinessPrice      VatExclusiveQuantityPrice1        VatExclusiveQuantityPrice2     VatExclusiveQuantityPrice3        VatExclusiveQuantityPrice4     VatExclusiveQuantityPrice5
XX-XXXX-XXXX   XXXXXXXXXX     0.01   1                                                                                                                                                        
XX-XXXX-XXX   XXXXXXXXXX     0.01    1                                                                                                                                                       
XXX-XXX-XXX    XXXXXXXXXX     0.01   1“

Когда я конвертирую это в массив, это выглядит так:

array(22702) {
  [0]=>
  string(3) "sku"
  [1]=>
  string(4) "asin"
  [2]=>
  string(5) "price"
  [3]=>
  string(8) "quantity"
  [4]=>
  string(14) "Business Price"
  [5]=>
  string(19) "Quantity Price Type"
  [6]=>
  string(22) "Quantity Lower Bound 1"
  [7]=>
  string(16) "Quantity Price 1"
  [8]=>
  string(22) "Quantity Lower Bound 2"
  [9]=>
  string(16) "Quantity Price 2"
  [10]=>
  string(22) "Quantity Lower Bound 3"
  [11]=>
  string(16) "Quantity Price 3"
  [12]=>
  string(22) "Quantity Lower Bound 4"
  [13]=>
  string(16) "Quantity Price 4"
  [14]=>
  string(22) "Quantity Lower Bound 5"
  [15]=>
  string(16) "Quantity Price 5"
  [16]=>
  string(14) "ProductTaxCode"
  [17]=>
  string(17) "VatExclusivePrice"
  [18]=>
  string(25) "VatExclusiveBusinessPrice"
  [19]=>
  string(26) "VatExclusiveQuantityPrice1"
  [20]=>
  string(26) "VatExclusiveQuantityPrice2"
  [21]=>
  string(26) "VatExclusiveQuantityPrice3"
  [22]=>
  string(26) "VatExclusiveQuantityPrice4"
  [23]=>
  string(40) "VatExclusiveQuantityPrice5
XX-XXXX-XXXX"
  [24]=>
  string(10) "XXXXXXXXX"
  [25]=>
  string(5) "0.01"
  [26]=>
  string(1) "1"
  [27]=>
  string(0) ""
  [28]=>
  string(0) ""
  [29]=>
  string(0) ""
  [30]=>
  string(0) ""
}

Есть несколько проблем с этим, заголовок «VatExclusiveQuantityPrice5» смешивается с первым фрагментом информации, который является SKU продукта, поэтому он находится в том же элементе в массиве.

В строке с разделителями табуляции также используется 20 табуляций в качестве «новой строки», поэтому я получаю 20 пустых элементов в массиве перед следующей информацией.

У меня есть одно возможное решение, которое включает в себя преобразование его в текстовый файл и импорт прямо в базу данных, но, конечно, должен быть простой способ преобразовать это в массив PHP, вариант с базой данных кажется гораздо более сложным способом обращаться с этой информацией.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018
$myArray = [];
$lines = explode(PHP_EOL, $myText);
$l = 0;
foreach($lines as $line) {
    $myArray[$l] = explode("\t", $line);
    $l++;
}

PHP_EOL: один из новых разделителей строк, "\ n", "\ r" или "\ n \ r"

"\ t": символ табуляции с двойными кавычками, поэтому PHP может интерпретировать его как специальный символ, а не просто строку \ t

В первой строке будут заголовки, а в следующей - содержимое таблицы.

0 голосов
/ 04 июля 2018

PHP имеет простую функцию explode(), которая делает именно это: берет строку, разделяет ее по указанному разделителю и возвращает массив.

http://php.net/manual/en/function.explode.php

Возможно, вам придется настроить параметр разделителя или заменить символы в строке, чтобы сделать один разделитель, или не добавлять его вообще, если это просто простая вкладка.

...