2012-03-27 5 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); 
?> 

Как вы видите, он ломает array вверх в заказы, которые имеют 'lotCodes' и заказов, которые этого не делают, теперь у меня есть два arrays.

Теперь я пытаюсь удалить дубликаты значений для 'Order_ID''Customer_ID & 'OrderDate', которые имеют самые 'lotCode' значения в первом array. Я только хочу, чтобы они появлялись один раз, после чего значения 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 и т.д.) на верхнем уровне, а затем под-массивом лот-кодов и qty.

Но, как более общий момент, вы должны отказаться от использования семейства функций mysql_ - они устарели. Вы должны использовать mysqli_ или даже лучше PDO.

+0

То, что я пытаюсь сделать получает значения для каждого 'lotCode' и' qty', которые являются частью 'Order_ID', не получая' Order_ID' более одного раза. Я просто не могу понять правильное утверждение. – 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 
} 

Edit:

// 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 или orer date) – grifos

Смежные вопросы