0
 Merchant Id|Merchant|Website|Transaction In Period|Voids In Period|Gross Sales Amount|Total Commision in Period         
 9766|Mountains Plus Outdoor Gear|www.MPGear.com|1|0|88.91|8.89 
 12447|Meritline.com|www.meritline.com|5|0|52.86|3.71
 16213|East Coast Fashions|www.discountstripper.com|1|0|32.27|3.23
 17226|HRM USA|www.HeartRateMonitorsUSA.com|1|0|189.9|6.65

URL から上記の文字列を取得しています。分割区切り文字に基づいてその文字列を配列に変換したい|

しかし、新しい各行の終了後に区切り文字が配置されていないという問題がある|ため、各行の終了後にその区切り文字を配置したいと考えています。

注 :: すべての列が事前定義され、常に同じ要求が返されます。

このコードを使用して、その文字列を配列に変換しています。すべての区切り文字が文字列に正しく配置されている場合、このコードは完全に機能します。

$NumColumns = 6;
$Delim = "|";
$data = array_chunk(explode($Delim,$contents), $NumColumns); 

出力は次のようになります

Array
(
    [0] => Array
        (
            [0] => Merchant Id
            [1] => Merchant
            [2] => Website
            [3] => Transaction In Period
            [4] => Voids In Period
            [5] => Gross Sales Amount
            [6] => Total Commision in Period 
        )

    [1] => Array
        (
            [0] => 9766
            [1] => Mountains Plus Outdoor Gear
            [2] => www.MPGear.com
            [3] => 1
            [4] => 0
            [5] => 88.91
            [6] => 8.89

        )  
        -----
        ----
)
4

3 に答える 3

3

str_getcsvまたはを使用してみてくださいexplode

<?php
    $data_from_url = "Merchant Id|Merchant|Website|Transaction In Period|Voids In Period|Gross Sales Amount|Total Commision in Period
9766|Mountains Plus Outdoor Gear|www.MPGear.com|1|0|88.91|8.89 
12447|Meritline.com|www.meritline.com|5|0|52.86|3.71
16213|East Coast Fashions|www.discountstripper.com|1|0|32.27|3.23
17226|HRM USA|www.HeartRateMonitorsUSA.com|1|0|189.9|6.65";
    $splitted_data = explode(PHP_EOL, $data_from_url);
    /**
     * print_r($splitted_data) will be
     * Array
     * (
         [0] => "Merchant Id|Merchant|Website|Transaction In Period|Voids In Period|Gross Sales Amount|Total Commision in Period"
         [1] => "9766|Mountains Plus Outdoor Gear|www.MPGear.com|1|0|88.91|8.89"
         ...
     * )
     */
     // You can now iterate through the lines
     $output1 = array();
     foreach($splitted_data as $row) {
        $output1[] = str_getcsv(trim($row), '|'); // parses a 
        // OR
        //$output1[] = explode('|', trim($row));
     }
     // OR use array_map with callback function
     $output2 = array_map(function($line){ return explode('|', trim($line)); }, $splitted_data);
     $output3 = array_map(function($line){ return str_getcsv(trim($line), '|'); }, $splitted_data);
     var_dump($output1, $output2, $output3); // The result you want to achive
?>
于 2013-06-28T06:52:39.957 に答える
1

あなたの質問を正しく理解できれば、データを分割しようとしていますが、区切り文字|を文字列の一部として保持したいと考えています。
を使用するpreg_splitと、次のように実行できます。

$arr = preg_split('/([^|]*\|)/', $string, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

式は、 | ( [^|]*)以外の 0 個以上の文字
と一致し、区切り文字と一致し|ます。2 つの組み合わせが区切り文字として使用されます。つまり、すべてが区切り文字になりました。
そのため、定義済みの定数を使用する必要がありますPREG_SPLIT_DELIM_CAPUTRE

もちろん、区切り文字の間には何もありませんが、preg_splitこの何もないこともキャプチャして、結果の配列に空の一致を追加します。そのため、別の定義済み定数を使用する必要があります: PREG_SPLIT_NO_EMPTY.
2 つの定数は、ビットごとの OR 演算子によって結合されます。|

$output = explode(PHP_EOL, $input);
foreach($output as &$line)
{//$line is a reference here, important!
    $line = preg_split('/([^|]*\|)/', $line, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
}

|これにより、区切り文字を文字列に保持したい場合、目的の出力が生成されるはずです。そうでない場合:

$output = explode(PHP_EOL, $input);
foreach($output as &$line)
{
    $line = explode('|', $line);
}

それだけです、本当に...

于 2013-06-28T07:01:03.817 に答える
1

これを 2 段階のプロセスとして行います。最初に\n(改行) 文字で行に分割し、次にその文字で各行を分割します|

次のように、数行だけでそれを行うことができます。

$lines = explode("\n", $contents);
$data = array_map(function($line) {return explode('|', trim($line));}, $lines);

ここでこれが機能していることを確認できます: http://phpfiddle.org/main/code/9fv-h2c

内容を個々の行に分割したら、array_map()関数を使用して、配列のすべての要素 (すべての行) に同じ操作を適用しています。

array_map()配列内の各要素に対してコールバック関数 (無名関数として定義) を呼び出します。この例では、行をトリミングして余分なスペースを削除し、|文字で分割して個々のフィールドを取得する単純な関数を定義しました。

array_map 行が少し複雑な場合は、次のように無名関数を使用せずに書き直すことで、どのように機能するかを説明できます。

function processLine($line) {
    $line = trim($line);
    $fields = explode('|', $line);
    return $fields;
}
$data = array_map('processLine', $lines);

...または、次のように array_map を使用せずに書き直すこともできます。

function processLine($line) {
    $line = trim($line);
    $fields = explode('|', $line);
    return $fields;
}
$data = array();
foreach ($lines as $l) {
    $data[] = processLine($l);
}
于 2013-06-28T07:30:44.417 に答える