1

I originally posted this Other Question and have expanded my question and moved onto this question from it.

I'm trying to split up an array and remove some partial unique values from a MYSQL SELECT QUERY with PHP.

Here's the out put I'm getting...

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] => ) )

From this Query...

<?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);
?>

As you see, it breaks the array up into orders that have 'lotCodes' and orders that do not so I now have two arrays.

Now, I'm trying to remove the duplicate values for the 'Order_ID' 'Customer_ID & 'OrderDate' that have the 'lotCode' values in the first array. I only want them to appear once followed by the lotCode values as many as they may be.

I tried using array_unique but that removed the rest with the lotCodes that I need for the output.

So, what I'm going for would be something like:

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

Instead of:

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

I hope that's clear.

Any suggestions on this guys?

2 Answers 2

0

Why do you not makes things easier (from my point of view) by creating an array like

// 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 ) 

Regards

Sign up to request clarification or add additional context in comments.

1 Comment

I updated my post to show you a simple way to append the value in your array. You just have to get the Order_iD once (along with custimer id or orer date)
0

In terms of your actual code, you could do something like this

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'];

    }
}

What this will give you is a multi-dimensional array with the order "header" info (order_id, customer_id and order_date etc) at the top level and then a sub-array of lotCodes and qty.

But as a more general point you should move away from using the mysql_ family of functions - they're deprecated. You should use mysqli_ or even better PDO.

2 Comments

What I'm trying to do is get the values for each lotCode & qty that are a part of the Order_ID without getting the Order_ID more than once. I just can't figure out the proper statement for it.
@Monty Ok, I've tweaked my code to provide that and added a little bit more explanation.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.