2016-06-16 10 views
0

これを適切にタイトルを付ける方法はわかりませんが、私は現在実行中の問題です。カートとチェックアウトシステムを構築し、注文を確定した時点ですべてのデータをデータベースにロードします。スペースを節約するために、元々アイテムIDだけを保存していましたが、データベースからアイテムを削除すると問題が発生しました(廃止されたなどの理由で、必要な情報は返されません)。彼らが1アイテム以上注文した場合、データベースレコードは間違っています。だから私はそうのようなデータを保存:PHP - 配列を引っ張って文字列を分割する

Itemid:Quantity:Price:name, itemid2:quantity2:price2:name2
OR
1:3:20.00:Flower Hat, 2:1:17.75:diamonds

私は今、私は助けを必要とすることを持っている問題がこれです。私は4つの値を$price$item$id$ammountのような変数に分ける必要があるので、注文履歴ページにそれらを表示することができます。そして、配列のすべての項目をループする必要があります。その項目に対応するフィールド。

私はstrposを使用して、同じデータベースフィールドから配送情報を取得しています。これは、METHOD:Priceという形式でフォーマットされていますが、私の文字列には3つの文字があります。ありがとう。

+0

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

答えて

1

機能

function parseItems($dbjunk){ 
    $cart = array(); 
    $items = explode(",",$dbjunk); 
    foreach($items as $i){ 
     $chunks = explode(":", $i); 
     $cart[] = array(
      "ItemID" => $chunks[0] , 
      "Quantity" => $chunks[1] , 
      "Price" => $chunks[2] , 
      "name" => $chunks[3] 
     ); 
    } 
    return $cart; 
} 

使用例です:

$dbjunk = "Itemid:Quantity:Price:name, itemid2:quantity2:price2:name2"; 
$parsed = parseItems($dbjunk); 
print_r($parsed); 

参照:https://3v4l.org/rBkXF

あなたの代わりに、あなたはこのように、list()を使用することができ、配列の変数が必要な場合は...

$dbjunk = "Itemid:Quantity:Price:name, itemid2:quantity2:price2:name2"; 
$parsed = parseItems($dbjunk); 
foreach($parsed as $p){ 
    list($itemID, $Quantity, $Price, $name) = array_values($p); 
    var_dump($itemID, $Quantity, $Price, $name); 
} 

は、以下を参照してください。あなたが物理的にデータベースから項目を削除しないでくださいhttps://3v4l.org/l4vsn

+0

のようなものを試してみてください。回答者のおかげで。 – Kaboom

0

First Normal Formについて読んでください。基本的に、1つのフィールドに1つの値を格納したいとします。だから、これに代えて: - それは、今日、本質的に無料です

shipping_method = "method" 
shipping_price = "price" 

は、スペースを気ないでください:

shipping = "method:price" 

あなたはこのような何かをしたいです。お使いの削除済みアイテムのジレンマについて

、あなたの最初の実装が進むべき道だった:

  • ブールフィールドを追加します。この技術に戻すことに加え

    I stored just the item IDs originally 
    

    、私は2つのことをお勧めしますそのアイテムが現在利用可能かどうかを示すためにアイテムテーブルに追加します。これにより、レコードを削除/挿入したり、IDを変更せずにアイテムのオン/オフを切り替えることができるという追加機能が提供されます。

  • アイテムを削除する前に、アイテムが注文されたかどうかを確認してください。そうでない場合は、削除しても問題ありません。その場合は、代わりに無効にしてください。ここで
0

。代わりに、製品がアクティブ/非削除のどちらであるかを示す 'is_active'などの名前の新しい列を追加します。あなたの質問に答える は、ここに私の提案です:あなたは関係なく、項目が文字列であるどのくらいの文字列内のすべての項目のデータを持つ配列を取得しません、このコードの

$orderString = '1:3:20.00:Flower Hat, 2:1:17.75:diamonds'; 
$items = array(); 
foreach(explode(', ', $orderString) as $itemString) { 
    $itemData = explode(':', $itemString); 
    $items[] = array(
     'id' => $itemData[0], 
     'amount' => $itemData[1], 
     'value' => $itemData[2], 
     'description' => $itemData[3] 
    ); 
} 

0

私はこの機能を使用すると、それはすぐに私の問題を解決し

$data = 1:3:20.00:Flower Hat, 2:1:17.75:diamonds 
list($price, $item, $uid, $id, $ammount) = explode(":", $data); 
echo $user; 
echo $item; 
関連する問題