【问题标题】:Tab-delimited PHP string to array制表符分隔的 PHP 字符串到数组
【发布时间】:2018-07-04 13:48:39
【问题描述】:

我正在使用 GitHub 上的 AmazonMwsComplete 存储库向 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 数组,数据库选项似乎要困难得多去处理这些信息。

【问题讨论】:

  • 可能是因为你需要说这些行是由 NewLines 终止的。如果你错过了,你会得到最后一个标题和第一条数据,因为它会一直持续到找到另一个标签
  • 先用换行符分隔,然后用制表符分隔。
  • 感谢您的回复,我如何告诉它 20 个制表符是一个换行符,而第一个换行符之前的第一组元素是标题?

标签: php arrays amazon-web-services aws-sdk csv


【解决方案1】:
$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":'tab' 字符,带有双引号,以便 PHP 可以将其解释为特殊字符,而不仅仅是字符串 \t

第一行是你的标题,接下来是表格内容。

【讨论】:

  • 如果您想将标题放在一个数组中,而将“表”行放在另一个数组中,您可以在 foreach 循环中的第一行测试 $i == 0 并将值放入 $ header[],否则将值放入 $tableLines[$i][]
【解决方案2】:

PHP 有一个简单的 explode() 函数,它可以做到这一点:获取一个字符串,在指定的分隔符处拆分它,然后返回一个数组。

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

如果只是一个简单的制表符,您可能需要调整分隔符参数,或替换字符串中的字符以制作单个分隔符,或者根本不需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 2015-06-06
    • 2023-03-30
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多