2016-12-11 10 views
1

これは可能かどうかわかりません。これをどのように行うことができないのか、私はPHPにとってはとても新しいですが、ここに私の問題の概要があります:文字列から値を分割してPHPの値の末尾に追加する

私はCSVファイルを読むスクリプトを持っています。列の1つにHTML表を含むセルが含まれています。すべてのテーブル内の様々な位置には、<td>Retail</td>を含む表の行があり、次に価格は<td>$300</td>などです。例では、その下に私がフォーマットされているされて、あなたが読んですることは簡単ですが、これは通常、CSVファイルからの連続文字列として返されるように:これらのテーブルは、その後、CAD [カナダが要求されている

<table> 
    <tr> 
     <td>Designer</td> 
     <td>Hermes</td> 
    </tr> 
    <tr> 
     <td>Size inch</td> 
     <td>5.9 x 4.3 x 2.4</td> 
    </tr> 
    <tr> 
     <td>Material</td> 
     <td>Cotton</td> 
    </tr> 
    <tr> 
     <td>Retail</td> 
     <td>$300.00</td> 
    </tr> 
    <tr> 
     <td>Made in</td> 
     <td>France</td> 
    </tr> 
</table> 

ドル]小売価格が追加されました。所望の最終結果を、以下の実施例:

<table> 
    <tr> 
     <td>Designer</td> 
     <td>Hermes</td> 
    </tr> 
    <tr> 
     <td>Size inch</td> 
     <td>5.9 x 4.3 x 2.4</td> 
    </tr> 
    <tr> 
     <td>Material</td> 
     <td>Cotton</td> 
    </tr> 
    <tr> 
     <td>Retail USD</td> 
     <td>$300.00</td> 
    </tr> 
    <tr> 
     <td>Retail CAD</td> 
     <td>$410.00</td> 
    </tr> 
    <tr> 
     <td>Made in</td> 
     <td>France</td> 
    </tr> 
</table> 

私はsubstr()を使用して見てきましたが、あなたがのために可能ではない文字列の先頭から無視されます文字の長さを指定する必要があるかのように見えます私のここではデータが変わります。

したがって、私の質問は、文字列から値段を明確に分けて、</tr>の後にそれを追加して結果が上記のようになるかどうかということです。あなたがこれを達成するために必要な機能の正しい方向に私を向けることができれば、本当に感謝します。 str_replace()RetailからRetail USDという名前に変更していますが、すでに財務APIを使用している米ドル価格をCAD価格に変換するための変数が作成されています。

私はここで私に提供できる任意の洞察力に感謝します。

+1

CSVではないので、あなたはCSVファイルからPHPを使ってウェブサイトでそのテーブルを作っていますか? – JSelser

+1

I自己フォーマットされ、この表をCSVからの私の問題は容易に理解できるように、実際の結果はそうのようなものです: '

​​デザイナー​​エルメス​​フランス​​サイズinch製​​​​5.9 X 4.3 X 2.4​​素材​​コットン​​色​​ホワイト​​小売​​$ 300.00​​ダストバッグ​​は含まれません​​ボックス​​は含まれません
'とCSVから文字列として返されます。ありがとうございました。 –

+1

これで、CSV – JSelser

答えて

1

私はSUBSTRを使用して見てきました。$final_output = $firstpart . $output_block . $last_part;

簡単ケーキ...:$ last_part

6.-あなたの最終的な出力:変数にあなたは、この後に持っている部分文字列を-save )しかし、文字列の先頭から無視される文字の長さを指定する必要があるかのように見えますが、データの変化に応じてここでは不可能です。

striposを使用すると、置換する文字列の先頭を見つけることができます。

しかし、私はこれをもっと深く掘り下げるので、それは非常に迅速に混乱するためです。あなたのCSVを突然変異させるのではなく、CSVジェネレータを編集する方が良いでしょう。理想的な世界では、CSVにはHTMLだけでなくデータだけが含まれているほうがよいでしょう。


謝罪、次の大規模かつおそらく扱いにくく答えになった:それを行うにはしかし

、あなたは変数$csvDataに、このCSVの列を分離する必要があります。

$csvData = "<table data from your question>"; 
$csvData = str_replace("</td>","*!*</td>",$csvData); 

//remove all the HTML junk 
$csvDataClean = strip_tags($csvData); 

// Form an array. 
$csvDataArray = explode("*!*",$csvDataClean); 

// trim contents of the array. 
$csvDataArray = array_map('trim', $csvDataArray); 

// remove empty array values. 
$csvDataArray = array_filter($csvDataArray); 

// build new contents array. 
foreach($csvDataArray as $key=>$value){ 
    if($key%2 == 0){ 
     //odd number. Is a content header. 
     $value = str_replace(" ","_",$value); 
     $lastHeader = preg_replace("/[^a-z0-9-_]/i","",$value); 
    } 
    else { 
     //even number, it's a value 
     $csvArray[$lastHeader] = $value; 
    } 
} 
//tidy up. 
unset($key,$value,$lastHeader,$csvDataArray,$csvDataClean); 

print_r($csvArray); 

これで、HTMLテーブルのヘッダーと値の配列が出力されます。この配列から値を簡単に参照し、それらをnessecaryとしてHTMLテーブルに再コンパイルすることができます。

Array 
(
    [Designer] => Hermes 
    [Size_inch] => 5.9 x 4.3 x 2.4 
    [Material] => Cotton 
    [Retail] => $300.00 
    [Made_in] => France 
) 

だから、あなたは、他の通貨の値を取得するには、この値$csvArray['Retail']とプロセスを取り、この配列に追加することができます:私は出力できphpsandboxを使用

。次に、このアレイを別のプロセスで実行してテーブルを再構築してCSVに保存することもできます(ただし、推奨されていませんが、CSV自体を保存する方が良いですが、要件はわかりません)。

ので:

//whatever system you currently use to get conversion. 
$csvArray['Retail_CAD'] = convert_currency($csvArray['Retail']); 
$csvArray['Retail_USD'] = convert_currency($csvArray['Retail']); 

そして今、HTMLフォームを再構築:

foreach($csvArray as $key=>$value){ 
    $csvOutput .= "<tr><td>".str_replace("_"," ",$key)."</td><td>".$value."</td></tr>\n"; 
} 
unset($key,$value); 
$csvOutput = "<table>".$csvOutput."</table>"; 

print_r($csvOutput); 

あなたは、最終的な配列値としてこれを維持したい場合は、手動でMade_in配列のキーを削除し、再度追加することができます:

//whatever system you currently use to get conversion. 
$csvArray['Retail_CAD'] = convert_currency($csvArray['Retail']); 
$csvArray['Retail_USD'] = convert_currency($csvArray['Retail']); 
.... 
$value = $csvArray['Made_in']; 
unset($csvArray['Made_in']); 
$csvArray['Made_in'] = $value; 

これは「で作成され、」維持のハックが、簡単な方法です上に追加された新しい小売列の後の列。

+0

この回答に時間と労力をいただき、ありがとうございます。私はそれを見てみましょう:) –

+0

あなたはすごく、ありがとう。 –

+1

それはあなたのために働いてうれしい:) @ matt136 – Martin

0

ここで貼り付けたものは、csvではなくhtmlテーブルです。

とにかく、文字列を操作するにはいくつかの方法があります。 str_replace()は最も基本的なものの1つで、すでに取得済みです。あなたの場合、正規表現を使用するのが最良でしょう。 str_replaceと似ていますが、はるかに強力です。そこにはたくさんのチュートリアルがあります。

htmlやxmlデータの操作をもっと複雑にしたい場合は、XSLTをご覧ください。

+0

ありがとうございます。 –

0

私はどうなるのか、一度同様のシナリオに対処しなければならなかったが、次のとおりです。

1.フォーム最初に、ご希望の出力ブロック変数$ output_blockで、すなわち:

<td>Retail USD</td><td>$300.00</td></tr><tr><td>Retail CAD</td><td>$410.00</td> 

注:あなたが元の出力に既にそれらを持っている最後の閉鎖のどちらの原因でも、firs opening trタグを必要としません。

<td>Retail</td> (使用strpos)の位置

あなたがAA変数IEの前に持っていたサブストリング3 - 保存2.-見つける:$ first_part

<td>Made in</td>

の位置を4を、見つけます

5。()

+0

すごく、ありがとう。私はこれを行こう! –

+1

「​​Made in」の長さを数えます。最後の部分をキャプチャするときにその位置に追加する必要があります –

関連する問題