2010-05-14 5 views
4

J'ai besoin de trouver des éléments communs entre deux tableaux. Mon code est:Array Intersect donnant une mauvaise sortie

$sql="SELECT DISTINCT fk_paytbl_discounts_discountid as discountid from paytbl_discounts_students WHERE fk_vtiger_cf_601='".$categoryid."'"; 
$discountstudentinfo=$objdb->customQuery($sql,false); 

$sql1="SELECT DISTINCT fk_paytbl_discounts_discountid as discountid from paytbl_discounts_variants WHERE fk_vtiger_products_productid='".$variantid."'"; 
$discountvariantinfo=$objdb->customQuery($sql1,false); 

$commondiscount=array_intersect($discountvariantinfo,$discountstudentinfo); 

Premier tableau

Array 
(
    [0] => Array 
     (
      [discountid] => 2 
     ) 

    [1] => Array 
     (
      [discountid] => 8 
     ) 

    [2] => Array 
     (
      [discountid] => 5 
     ) 

    [3] => Array 
     (
      [discountid] => 4 
     ) 

) 

tableau Second

Array 
(
    [0] => Array 
     (
      [discountid] => 1 
     ) 

    [1] => Array 
     (
      [discountid] => 5 
     ) 

) 

Common Array

Array 
(
    [0] => Array 
     (
      [discountid] => 1 
     ) 

    [1] => Array 
     (
      [discountid] => 5 
     ) 

) 

Common Array ne devrait avoir qu'une discountid 5 mais son représentant 1 aussi .

S'il vous plaît aidez-moi sur ce

Merci

Répondre

1

http://php.net/array_intersect

Note: Deux éléments sont considérés comme égaux si et seulement si (string) $ elem1 === (string) $ elem2. En mots: lorsque la représentation de la chaîne est la même.

donc la raison pour laquelle vous rencontrez un problème est parce que, par exemple:

(string) array('discountid' => 5) == (string) array('discountid' => 8) 

Si vous utilisez PHP 5.3, c'est une solution:

$comparisonFunction = function($elem1, $elem2) { 
    return $elem1['discountid'] == $elem2['discountid']; 
} 
$commondiscount = array_uintersect(
    $discountvariantinfo, 
    $discountstudentinfo, 
    $comparisonFunction 
); 

Avant PHP 5.3 vous pourriez utiliser le plus laid create_function() au lieu de la fermeture astucieuse. Si vous exécutez à l'intérieur d'une méthode, il sera probablement facile d'utiliser une nouvelle méthode privée pour l'utiliser comme rappel.

Si vous ne l'utilisez PHP 5.3 et vous ne voulez vraiment pas utiliser un rappel, vous pouvez utiliser l'idée suivante:

$uniqueDiscounts = array(); 
foreach ($discountvariantinfo as $dvi) { 
    $uniqueDiscounts[$dvi['discountid']] += 1; 
} 
foreach ($discountstudentinfo as $dsi) { 
    $uniqueDiscounts[$dsi['discountid']] += 1; 
} 

$commondiscount = array(); 
foreach ($uniqueDiscounts as $ud => $count) { 
    if ($count == 2) { 
     $commondiscount[] = array('discountid' => $ud); 
    } 
} 

Vous, bien sûr, veulent ranger ce ou ajouter commentaires pour expliquer l'algorithme.

Questions connexes