2010-11-01 9 views
4

J'ai un site de commerce électronique PHP/MySQL qui place des informations détaillées sur les commandes dans un tableau sérialisé à côté de l'adresse du client. Je veux être en mesure de sortir le champ des articles de commande, de le désérialiser puis de combiner les articles de la commande en un tableau principal de TOUS les articles commandés qui peuvent être manipulés afin de compter le nombre de commandes d'un produit spécifique. fabriqué.Désérialisation de MySQL dans un tableau PHP multidimensionnel

Les tableaux ressemblent à ceci lorsque j'imprime les lignes non sérialisées. Voici deux tableaux de commande, un avec 3 produits, et le second avec un seul. Les valeurs du tableau sont ID #, SKU #, Quantity, Product Name, Price. Je veux être capable de combiner TOUT ordre en un seul tableau, puis additionner les quantités totales pour chaque ID unique ou numéro de SKU.

Je me rends compte que ce type de chose est très simple si les données étaient propres dans MySQL, mais c'est la vie. Toutes les pensées sur la façon de manipuler ces tableaux seraient vraiment appréciées.

Dans ce cas, veulent se retrouver avec 4 tableaux, avec les 629/01-3600 ceux étant combinés de telle sorte que la valeur de quantité est maintenant 2

Un grand merci.

Array 
(
    [0] => Array 
     (
      [1] => 488 
      [5] => 23-1000 
      [2] => 3 
      [3] => PRODUCT NAME 
      [4] => 2.50 
     ) 

    [1] => Array 
     (
      [1] => 423 
      [5] => 24-2300 
      [2] => 1 
      [3] => PRODUCT NAME 
      [4] => 3.50 
     ) 

    [2] => Array 
     (
      [1] => 506 
      [5] => 23-2800 
      [2] => 1 
      [3] => PRODUCT NAME 
      [4] => 2.50 
     ) 

    [3] => Array 
     (
      [1] => 629 
      [5] => 01-3600 
      [2] => 1 
      [3] => PRODUCT NAME 
      [4] => 7.50 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [1] => 629 
      [5] => 01-3600 
      [2] => 1 
      [3] => PRODUCT NAME 
      [4] => 7.50 
     ) 

) 

EDIT:

Je voulais ajouter ce qui est finalement fait ce que je cherchais

foreach($query->result as $row) 
{ 
    $items[] = unserialize($row['FIELDNAME']); 
} 

foreach($items as $item) 
{ 
    foreach($item as $order) 
    { 
     if(isset($output_array[$order[1]])) 
     { 
      $output_array[$order[1]]['quantity'] += $order[2]; 
     } 
     else 
     { 
      $output_array[$order[1]] = array (
       'name' => $order[3], 
       'quantity' => $order[2], 
       'sku' => $order[5] 
       ); 
     } 
    } 

}

J'ai ensuite utilisé cette fonction de tri pour trier la quantité: http://www.php.net/manual/en/function.sort.php#99419

Répondre

2

Ceci est un peu de code, donc je l'ai séparé en c les mecs.

Voici ma reconstitution de vos deux baies. La dernière ligne les met en un.

$items = array(
    array(
     1 => 488, 
     5 => '23-1000', 
     2 => 3, 
     3 => 'PRODUCT NAME', 
     4 => 2.50 
    ), 

    array(
     1 => 423, 
     5 => '24-2300', 
     2 => 1, 
     3 => 'PRODUCT NAME', 
     4 => 3.50 
    ), 

    array(
     1 => 506, 
     5 => '23-2800', 
     2 => 1, 
     3 => 'PRODUCT NAME', 
     4 => 2.50 
    ), 

    array(
     1 => 629, 
     5 => '01-3600', 
     2 => 1, 
     3 => 'PRODUCT NAME', 
     4 => 7.50 
    ) 
); 

$array_2 = array(
    array(
     1 => 629, 
     5 => '01-3600', 
     2 => 1, 
     3 => 'PRODUCT NAME', 
     4 => 7.50 
    ) 
); 

// Put the two arrays together (master array) 
$new_array = array_merge($items, $array_2); 

Ensuite, nous allons créer deux tableaux qui utiliseront le numéro de référence et un autre pour les ID.

// What the items will be sorted by 
$skus = array(); 
$ids = array(); 

La partie plus compliquée

// Loop through the combined items 
foreach($new_array as $item) { 

    /** 
    * Check if the item's SKU number 
    * has been added to the $skus array. 
    * 
    * If it has then add the old qty with the current item's 
    * 
    * Else, the item hasn't been added yet, 
    * then add the entire item to the list 
    */ 
    if(isset($skus[$item[5]])) { 

    // If it exists, then add the new qty 
    $skus[$item[5]][2] += $item[2]; 

    }else { 

    // If it doesn't exist, then append it to the array 
    $skus[$item[5]] = $item; 
    } 


    // Do the same thing as above 
    // except for the id numbers 
    if(isset($ids[$item[1]])) { 

    // If it exists, then add the new qty 
    $ids[$item[1]][2] += $item[2]; 

    }else { 

    // If it doesn't exist, then append it to the array 
    $ids[$item[1]] = $item; 
    } 
} 

Assurez-vous que tout est la façon dont vous voulez

echo '<h2>SKU Numbers</h2>'; 
echo '<pre>'; 
print_r($skus); 
echo '</pre>'; 

echo '<h2>ID Numbers</h2>'; 
echo '<pre>'; 
print_r($ids); 
echo '</pre>'; 

Hope this helps.

EDIT

Pour que ce code fonctionne pendant la boucle réelle, vous pouvez essayer quelque chose comme ça. Bien que je ne sois pas complètement sûr si cela fonctionnera hors de la boîte, il devrait être un bon point de départ.

// What the items will be sorted by 
$skus = array(); 
$ids = array(); 

foreach($result as $row) { 

    $row = unserialize($row); 

    /** 
    * MODIFIED 
    * 
    * Check if the $row's SKU number 
    * has been added to the $skus array. 
    * 
    * If it has then add the old qty with the current $row's qty 
    * 
    * Else, the $row hasn't been added yet, 
    * then add the entire $row to the list 
    */ 
    if(isset($skus[$row[5]])) { 

    // If it exists, then add the new qty 
    $skus[$row[5]][2] += $row[2]; 

    }else { 

    // If it doesn't exist, then append it to the array 
    $skus[$row[5]] = $row; 
    } 


    // Do the same thing as above 
    // except for the id numbers 
    if(isset($ids[$row[1]])) { 

    // If it exists, then add the new qty 
    $ids[$row[1]][2] += $row[2]; 

    }else { 

    // If it doesn't exist, then append it to the array 
    $ids[$row[1]] = $row; 
    } 

} 
+0

Au-delà, merci Baylor Rae. – noahkuhn

+0

En fait, même si je sais que cela fonctionnera éventuellement. J'exécute une boucle foreach ($ result as $ row) afin de retirer les champs sérialisés et de les désérialiser. Afin de fusionner dire cent rangées, je devrais créer une nouvelle variable chaque fois que je boucle à droite? Puis combiner toutes les centaines en utilisant array_merge? – noahkuhn

+0

J'ai ajouté une modification à mon code (en bas) qui donne un exemple sur la façon de placer les éléments dans les variables $ skus et $ ids. –