2015-09-16 2 views
1

J'ai essayé toutes sortes de solutions, et aucune ne semble faire ce dont j'ai besoin - ou je ne comprends pas comment les transformer pour résoudre mon problème particulier. Fondamentalement, je retourne un tas de rangées de mon serveur SQL. La requête ressemble à ceci:Comment puis-je fusionner tous les doublons dans un tableau en fonction de la valeur d'une clé?

$params = array(&$search, &$search, &$search, &$search, &$search, &$search, &$search, &$search); 

$tsql = "SELECT Item.ID, Item.ItemLookupCode, nitroasl_pamtable.ManufacturerPartNumber, SupplierList.ReorderNumber, Item.Notes, 
     Item.Description, Item.ExtendedDescription, Item.Quantity, nitroasl_pamtable.SpoofStock, Item.Price, 
     nitroasl_pamtable.PAM_Keywords, Item.PictureName 
     FROM Item 
     INNER JOIN nitroasl_pamtable ON Item.ID = nitroasl_pamtable.ItemID 
     INNER JOIN SupplierList ON Item.ID = SupplierList.ItemID 
     WHERE (Item.ItemLookupCode LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1) 
     OR (Item.ID LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1) 
     OR (nitroasl_pamtable.ManufacturerPartNumber LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1) 
     OR (SupplierList.ReorderNumber LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1) 
     OR (Item.Notes LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1) 
     OR (Item.Description LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1) 
     OR (Item.ExtendedDescription LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1) 
     OR (nitroasl_pamtable.PAM_Keywords LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)"; 

// Allows us to determine the number of rows returned 
$cursorType = array('Scrollable' => SQLSRV_CURSOR_KEYSET); 

$getProducts = sqlsrv_query($conn, $tsql, $params, $cursorType); 

J'utilise ensuite ce qui suit pour mettre les lignes dans un tableau:

// Put results into an array 
while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) 
{ 
    $results['results'][] = $row; 
} 

$ résultats [ « résultats »] ressemble à ceci quand je recherche "tp-ac1750 (Suppression de quelques colonnes retourné pour faciliter la visualisation):

Array (

    [results] => Array (

    [0] => Array (

     [ItemLookupCode] => TP-AC1750 

     [ReorderNumber] => ARCHERC7 

    ) 

    [1] => Array (

     [ItemLookupCode] => TP-AC1750 

     [ReorderNumber] => N82E16833704177 

    ) 

    [2] => Array (

     [ItemLookupCode] => TP-AC1750 

     [ReorderNumber] => 7681617 

    ) 

    [3] => Array (

     [ItemLookupCode] => TP-AC1750 

     [ReorderNumber] => ARCHERC7 

    ) 

) 

    [keywords] => tp-ac1750 

) 

Je voudrais que le tableau à ressembler à ceci:

Array (

    [results] => Array (

    [0] => Array (

     [ItemLookupCode] => TP-AC1750 

     [ReorderNumber] => Array (

     [0] => ARCHERC7 

     [1] => N82E16833704177 

     [2] => 7681617 

    ) 

    ) 

) 

) 

J'ai essayé:

  • array_unique
  • array_unique_recursive
  • array_walk_recursive
  • array_merge_recursive
  • Et plus (diverses combinaisons)

Mais je n'arrive pas à bien faire les choses. Voici ce que j'essaie maintenant:

// Remove duplicates 
$results['results'] = merge_duplicates($results['results']); 

//*********************************************** 
// Merge duplicate arrays and their values 
//*********************************************** 
function merge_duplicates($array) 
{ 

    // Build temporary array for array_unique 
    $tmp = array(); 
    foreach($array as $key => $value) { 
    $tmp[ $key ] = $value; 
    } 

    // Find duplicates in temporary array 
    $tmp = array_unique($tmp, SORT_REGULAR); 

    // Remove duplicates from original array 
    foreach($array as $key => $value) { 

    if (!array_key_exists($key, $tmp)) { 

     unset($array[ $key ]); 

    } 

    } 

    return $array; 

} 

Existe-t-il un moyen d'accomplir ce type de fusion? Existe-t-il un moyen de fusionner ces doublons lors de la requête SQL? Tout avis sera le bienvenu! Merci d'avance :)

Mise à jour (Array pleine Être travaillé avec)

Voici le tableau réel que je dois utiliser cette fusion (je veux toujours utiliser ItemLookupCode comme clé unique, mais fusionner tous les autres clés frères et soeurs):

Array (

    [0] => Array (

    [ID] => 8265 
    [ItemLookupCode] => TP-AC1750 
    [ManufacturerPartNumber] => Archer C7 
    [ReorderNumber] => ARCHERC7 
    [Notes] => TP-LINK Archer C7 AC1750 Routr 
    [Description] => TP-LINK Archer C7 AC1750 Routr 
    [ExtendedDescription] => TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router 
    [Quantity] => 0 
    [SpoofStock] => 
    [Price] => 129.9500 
    [PAM_Keywords] => 
    [PictureName] => tp-ac1750.jpg 

) 

    [1] => Array (

    [ID] => 8265 
    [ItemLookupCode] => TP-AC1750 
    [ManufacturerPartNumber] => Archer C7 
    [ReorderNumber] => N82E16833704177 
    [Notes] => TP-LINK Archer C7 AC1750 Routr 
    [Description] => TP-LINK Archer C7 AC1750 Routr 
    [ExtendedDescription] => TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router 
    [Quantity] => 0 
    [SpoofStock] => 
    [Price] => 129.9500 
    [PAM_Keywords] => 
    [PictureName] => tp-ac1750.jpg 

) 

    [2] => Array (

    [ID] => 8265 
    [ItemLookupCode] => TP-AC1750 
    [ManufacturerPartNumber] => Archer C7 
    [ReorderNumber] => 7681617 
    [Notes] => TP-LINK Archer C7 AC1750 Routr 
    [Description] => TP-LINK Archer C7 AC1750 Routr 
    [ExtendedDescription] => TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router 
    [Quantity] => 0 
    [SpoofStock] => 
    [Price] => 129.9500 
    [PAM_Keywords] => 
    [PictureName] => tp-ac1750.jpg 

) 

    [3] => Array (

    [ID] => 8265 
    [ItemLookupCode] => TP-AC1750 
    [ManufacturerPartNumber] => Archer C7 
    [ReorderNumber] => ARCHERC7 
    [Notes] => TP-LINK Archer C7 AC1750 Routr 
    [Description] => TP-LINK Archer C7 AC1750 Routr 
    [ExtendedDescription] => TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router 
    [Quantity] => 0 
    [SpoofStock] => 
    [Price] => 129.9500 
    [PAM_Keywords] => 
    [PictureName] => tp-ac1750.jpg 

) 

) 
+0

Ce n'est pas vraiment ce que vous demandez, mais il pourrait être utile. http://geneticcoder.blogspot.com/2015/05/removing-duplicate-rows-from-2.html –

+0

Il existe quelques possibilités dans cet article. Je vais expérimenter et voir ce qui se passe :) Il ya un thème récurrent avec ces méthodes, que je ne sais pas comment faire ... Beaucoup de ces fonctions comme 'array_merge_recursive' veulent deux tableaux passés à la fonction pour la comparaison. .. J'ai besoin de comparer de nombreux tableaux (pas seulement deux) ... – derekmx271

+0

Vous êtes toujours 'INNER JOIN'ing et renvoyant (potentiellement) plusieurs lignes pour chaque' Item' dans un seul jeu de résultats. Ce n'est pas ce que j'ai recommandé. – ErikE

Répondre

1

façon la plus rapide que je peux penser:

<?php 
$results = array(
    array('ItemLookupCode' => 'name1', 'ReorderNumber' => 1), 
    array('ItemLookupCode' => 'name1', 'ReorderNumber' => 2), 
    array('ItemLookupCode' => 'name1', 'ReorderNumber' => 3), 
    array('ItemLookupCode' => 'name1', 'ReorderNumber' => 2), 
    array('ItemLookupCode' => 'name2', 'ReorderNumber' => 1), 
    array('ItemLookupCode' => 'name2', 'ReorderNumber' => 1), 
); 

function group($main, $item) { 
    if(!isset($main[$item['ItemLookupCode']])) { 
     $main[$item['ItemLookupCode']] = array('ReorderNumber' => array()); 
    } 
    if(!in_array($item['ReorderNumber'], $main[$item['ItemLookupCode']]['ReorderNumber'])) { 
     $main[$item['ItemLookupCode']]['ReorderNumber'][] = $item['ReorderNumber']; 
    } 
    return $main; 
} 

$formatted_result = array(); 
foreach(array_reduce($results, "group") as $name => $item) { 
    $formatted_result[] = array(
     'ItemLookupCode' => $name, 
     'ReorderNumber' => $item 
    ); 
} 
print_r($formatted_result); 
+0

Ceci place les résultats combinés dans un tableau nommé 'ReorderNumber' à l'intérieur d'un tableau parent nommé' ReorderNumber' . Comiquement, je ne peux pas comprendre comment faire passer les valeurs de l'enfant d'un niveau dans le parent ... – derekmx271

+0

'Tableau ( [0] => Tableau ( [ID] => 8265 [ReorderNumber] => Tableau ( [ReorderNumber] => Tableau ( [0] => N82E16833704177 [1] => 7681617 [2] => ARCHERC7 [3] => ARCHERC7 ) ) ) ) 'j'ai changé ** ItemLookupCode ** à ** ID ** btw. – derekmx271

+0

Comment est-ce que j'ai pu ajuster ce script pour qu'il n'y ait pas plusieurs niveaux de 'ReorderNumber'? – derekmx271