2012-03-27 9 views
1

私はもともとこのOther Questionを投稿していて、私の質問を拡大して、この質問に移っています。PHP配列内のユニークな値を並べ替える

MYSQL SELECT QUERYからPHPを使用して配列を分割し、一部の部分的な値を削除しようとしています。ここで

はこの照会の

Array ([Order_ID] => 1 [Customer_ID] => 42534 [OrderDate] => [lotCode] => 401042 [qty] => 8 [0] => 
Array ([0] => 1 [Order_ID] => 1 [1] => 42534 [Customer_ID] => 42534 [2] => [OrderDate] => [3] => 993647 [lotCode] => 993647 [4] => 9 [qty] => 9) [1] => 
Array ([0] => 1 [Order_ID] => 1 [1] => 42534 [Customer_ID] => 42534 [2] => [OrderDate] => [3] => 401040 [lotCode] => 401040 [4] => 55 [qty] => 55) [2] => 
Array ([0] => 1 [Order_ID] => 1 [1] => 42534 [Customer_ID] => 42534 [2] => [OrderDate] => [3] => 401040 [lotCode] => 401040 [4] => 66 [qty] => 66) [3] => 
Array ([0] => 1 [Order_ID] => 1 [1] => 42534 [Customer_ID] => 42534 [2] => [OrderDate] => [3] => 401042 [lotCode] => 401042 [4] => 8 [qty] => 8)) 

Array ([Order_ID] => 7 [Customer_ID] => 42534 [OrderDate] => [0] => 
Array ([0] => 2 [Order_ID] => 2 [1] => 42534 [Customer_ID] => 42534 [2] => [OrderDate] => [3] => [lotCode] => [4] => [qty] =>) [1] => 
Array ([0] => 3 [Order_ID] => 3 [1] => 42534 [Customer_ID] => 42534 [2] => [OrderDate] => [3] => [lotCode] => [4] => [qty] =>) [2] => 
Array ([0] => 4 [Order_ID] => 4 [1] => 42534 [Customer_ID] => 42534 [2] => [OrderDate] => [3] => [lotCode] => [4] => [qty] =>) [3] => 
Array ([0] => 5 [Order_ID] => 5 [1] => 42534 [Customer_ID] => 42534 [2] => [OrderDate] => [3] => [lotCode] => [4] => [qty] =>) [4] => 
Array ([0] => 6 [Order_ID] => 6 [1] => 42534 [Customer_ID] => 42534 [2] => [OrderDate] => [3] => [lotCode] => [4] => [qty] =>) [5] => 
Array ([0] => 7 [Order_ID] => 7 [1] => 42534 [Customer_ID] => 42534 [2] => [OrderDate] => [3] => [lotCode] => [4] => [qty] =>)) 

...

<?php 

$withLotCodes = array(); 
$noLotCodes = array(); 

$OrdersToShip2 = mysql_query(" 
     SELECT o.Order_ID, o.Customer_ID, o.OrderDate, olc.lotCode, olc.qty 
     FROM Orders o 
     LEFT JOIN OrdersLotCodes olc ON o.Order_ID = olc.Order_ID 
     WHERE o.LotCoded = 0 ORDER BY o.Order_ID"); 

if($OrdersToShip2) { 

    while ($info = mysql_fetch_array($OrdersToShip2)) 
    { 
      if(!isset($info['lotCode'])){ 
       // if NO lotCode 
       $noLotCodes['Order_ID']  = $info['Order_ID']; 
       $noLotCodes['Customer_ID'] = $info['Customer_ID']; 
       $noLotCodes['OrderDate'] = $info['OrderDate']; 

       array_push($noLotCodes,$info); 

       }else{ 
       // if YES lotCode 
       $withLotCodes['Order_ID'] = $info['Order_ID']; 
       $withLotCodes['Customer_ID'] = $info['Customer_ID']; 
       $withLotCodes['OrderDate'] = $info['OrderDate']; 
       $withLotCodes['lotCode']  = $info['lotCode']; 
       $withLotCodes['qty']   = $info['qty']; 

       array_push($withLotCodes,$info); 

       } 
    } 
      }else{ 
      echo "encountered an error.".mysql_error(); 
    } 

print_r($withLotCodes); 
echo '<br><br>'; 
print_r($noLotCodes); 

mysql_close($conn); 
?> 

ご覧のとおり、それは'lotCodes'を持ち、受注にアップarrayを壊す...私は取得しています入れてます注文しないので、私は今2つのarraysを持っています。

今、私が最初にarray'lotCode'値を持つ'Order_ID''Customer_ID & 'OrderDate'について重複する値を削除しようとしています。私は一度だけ表示され、その後にlotCode値が多く表示されるようにしたい。

私はarray_uniqueを使ってみましたが、残りの部分は出力に必要なlotCodesで削除しました。

だから、何私はつもりはのようになります。

Order_ID, Customer_ID, OrderDate, lotCode, qty, lotCode, qty, lotCode, qty, lotCode, qty 

の代わりに:

Order_ID, Customer_ID, OrderDate, lotCode, qty 
Order_ID, Customer_ID, OrderDate, lotCode, qty 
Order_ID, Customer_ID, OrderDate, lotCode, qty 
Order_ID, Customer_ID, OrderDate, lotCode, qty 

私はそれは明らかだ願っています。

この男の提案はありますか?あなたの実際のコードの面では

答えて

0

、あなたは、これはあなたを与えるだろう何この

while ($info = mysql_fetch_array($OrdersToShip2)) 
{ 
    if(!isset($info['lotCode'])){ 
     if(!isset($noLotCodes[$info['Order_ID']])) { 
      $noLotCodes[$info['Order_ID']] = $info; 
     } 
     $noLotCodes[$info['Order_ID']]['lotCode'][$info['lotCode']] = $info['qty']; 

    }else{ 
     if(!isset($withLotCodes[$info['Order_ID']])) { 
      $withLotCodes[$info['Order_ID']] = $info; 
     } 
     $withLotCodes[$info['Order_ID']]['lotCode'][$info['lotCode']] = $info['qty']; 

    } 
} 

のような何かができるため、「ヘッダ」情報(ORDER_ID、CUSTOMER_IDとORDER_DATEなど)を備えた多次元配列でありますトップレベルで、次にlotCodesとqtyのサブアレイを作成します。

しかし、より一般的な点として、mysql_ファミリの機能を廃止する必要があります。廃止予定です。 mysqli_またはそれ以上のPDOを使うべきです。

+0

'Order_ID'を何度も取得することなく、' Order_ID'の一部である 'lotCode'と' qty'のそれぞれの値を取得します。私はちょうどそれのための適切な声明を理解することができません。 – Monty

+0

@Montyオクラホマ、私はそれを提供するために私のコードを微調整し、もう少し説明を追加しました。 – liquorvicar

0

なぜあなたはないような配列を作成することで、(私の視点から)物事が容易になりません

// you create your order array 
$orders = array(); 
// Then for each lot and quantity 
$order[$Order_ID][$Customer_ID][$OrderDate][] = array('lotCode'=>$lotcode, 'qty'=>$qty); 
$order[$Order_ID][$Customer_ID][$OrderDate][] = array('lotCode'=>$lotcode2, 'qty'=>$qty2); 

// You can test if a specified value exist with isset 
// Like 
if (isset ( $order[1][42534 ][3])) 
{ 
    // Found order list with order ID 1, cutomer id 42534 and order date 3 
} 

編集:

// Select emulation 
$mysqlreturnarrayemul = array(); 
$mysqlreturnarrayemul[0]['Order_ID'] = 1; 
$mysqlreturnarrayemul[0]['Customer_ID'] = 42534; 
$mysqlreturnarrayemul[0]['OrderDate'] = 3; 
$mysqlreturnarrayemul[0]['lotCode'] = 1; 
$mysqlreturnarrayemul[0]['qty'] = 200; 

$mysqlreturnarrayemul[1]['Order_ID'] = 1; 
$mysqlreturnarrayemul[1]['Customer_ID'] = 42534; 
$mysqlreturnarrayemul[1]['OrderDate'] = 3; 
$mysqlreturnarrayemul[1]['lotCode'] = 5; 
$mysqlreturnarrayemul[1]['qty'] = 8456; 

// you create your order array 
$orders = array(); 
foreach ($mysqlreturnarrayemul as $info) 
{ 
    // Then you add lot code and quantity 
    $order[$info['Order_ID']][$info['Customer_ID']][$info['OrderDate']][] = $info['lotCode']; 
    $order[$info['Order_ID']][$info['Customer_ID']][$info['OrderDate']][] = $info['qty']; 
} 

// You can test if a specified value exist with isset 
// Like 
if (isset ( $order[1][42534 ][3])) 
{ 
    // Found order list with order ID 1, cutomer id 42534 and order date 3 
    print_r($order[1][42534 ][3]); 

} 
// print_r: Array ([0] => 1 [1] => 200 [2] => 5 [3] => 8456) 

よろしく

私が何をしようとしている
+0

上記のコメントを参照してください。 – Monty

+0

あなたの配列に値を追加する簡単な方法を紹介するために投稿を更新しました。 Order_iDを一度取得するだけで(custimer idまたはorer dateとともに) – grifos