Array : fusionner les doublons

Eléphanteau du PHP | 17 Messages

13 déc. 2011, 18:43

Bonjour,

j'ai 3 tableaux :
$nom[0]="jean";
$nom[1]="georges";
$nom[2]="georges";
$nom[3]="yvette";

$qte[0]="5";
$qte[1]="10";
$qte[2]="3";
$qte[3]="25";

$article[0]="chaussure";
$article[1]="pull";
$article[2]="pantalon";
$article[3]="casquette";
je voudrais fusionner les doublons "nom" pour qu'il me donne
Array "nom"
(
[0] => jean
[1] => georges
[2] => yvette
)

Array "qte"
(
[0] => 5
[1] => 13
[2] => 25
)

Array "article"
(
[0] => chaussure
[1] => pull pantalon
[2] => casquette
)
merci

ViPHP
xTG
ViPHP | 7331 Messages

13 déc. 2011, 18:54

Tu peux le faire ainsi :
$nom[0]="jean";
$nom[1]="georges";
$nom[2]="georges";
$nom[3]="yvette";

$qte[0]="5";
$qte[1]="10";
$qte[2]="3";
$qte[3]="25";

$article[0]="chaussure";
$article[1]="pull";
$article[2]="pantalon";
$article[3]="casquette";

$nomFinal = array();
$qteFinal = array();
$articleFinal = array();
foreach($nom as $index => $val){
  if( ($i = array_search($nomFinal)) !== false ){
    $qteFinal[$i] += $qte[$index];
    $articleFinal[$i] .= ' ' . $article[$index];
  }else{
    $nomFinal[] = $val;
    $qteFinal[] = $qte[$index];
    $articleFinal[] = $article[$index];
  }
}

Eléphant du PHP | 171 Messages

13 déc. 2011, 19:40

Il y a aussi la fonction array_unique
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphanteau du PHP | 17 Messages

13 déc. 2011, 22:05

Tu peux le faire ainsi :
$nom[0]="jean";
$nom[1]="georges";
$nom[2]="georges";
$nom[3]="yvette";

$qte[0]="5";
$qte[1]="10";
$qte[2]="3";
$qte[3]="25";

$article[0]="chaussure";
$article[1]="pull";
$article[2]="pantalon";
$article[3]="casquette";

$nomFinal = array();
$qteFinal = array();
$articleFinal = array();
foreach($nom as $index => $val){
  if( ($i = array_search($nomFinal)) !== false ){
    $qteFinal[$i] += $qte[$index];
    $articleFinal[$i] .= ' ' . $article[$index];
  }else{
    $nomFinal[] = $val;
    $qteFinal[] = $qte[$index];
    $articleFinal[] = $article[$index];
  }
}
j'ai ce message d'erreur

Code : Tout sélectionner

Wrong parameter count for array_search()

Eléphanteau du PHP | 17 Messages

13 déc. 2011, 22:27

j'ai modifié le code
$nom[0]="jean";
$nom[1]="georges";
$nom[2]="georges";
$nom[3]="yvette";

$qte[0]="5";
$qte[1]="10";
$qte[2]="3";
$qte[3]="25";

$article[0]="chaussure";
$article[1]="pull";
$article[2]="pantalon";
$article[3]="casquette";

$nomFinal = array();
$qteFinal = array();
$articleFinal = array();
foreach($nom as $index => $val){
  if( ($i = array_search($val, $nom)) !== false ){
    $nomFinal[$i] = $val;
    $qteFinal[$i] += $qte[$index];
    $articleFinal[$i] .= ' ' . $article[$index];
  }else{
    $nomFinal[] = $val;
    $qteFinal[] = $qte[$index];
    $articleFinal[] = $article[$index];
  }
}
$nomFinal = array_values($nomFinal);
$qteFinal = array_values($qteFinal);
$articleFinal = array_values($articleFinal);

Eléphanteau du PHP | 17 Messages

14 déc. 2011, 01:49

le pb, sur un gros tableau c'est très lent

ViPHP
xTG
ViPHP | 7331 Messages

14 déc. 2011, 08:10

Ces données proviennent d'où ?
Car si cela vient d'un base pour le champ numérique tu peux faire une simple somme sur group by du nom.

Eléphanteau du PHP | 17 Messages

14 déc. 2011, 09:24

ça provient d'un fichier texte

Nouveau script, beaucoup plus rapide
$nom[0]="jean";
$nom[1]="georges";
$nom[2]="georges";
$nom[3]="yvette";
$nom[4]="georges";

$qte[0]="5";
$qte[1]="10";
$qte[2]="3";
$qte[3]="25";
$qte[4]="2";

$article[0]="chaussure";
$article[1]="pull";
$article[2]="pantalon";
$article[3]="casquette";
$article[4]="chaussette";

array_multisort($nom, $qte, $article);

$array_unique = array_unique($nom); 
if(count($nom) - count($array_unique)) { 
	for ($i=0; $i<count($nom); $i++) {
		if(! array_key_exists($i, $array_unique)) {
			$qteFinal[$j] += $qte[$i];
			$articleFinal[$j] .= " ".$article[$i];
		}
			else {
				$j=$i;
				$nomFinal[$i] = $nom[$i];
				$qteFinal[$i] = $qte[$i];
				$articleFinal[$i] = $article[$i];
			}
	} 
}
$nom = array_values($nomFinal);
$qte= array_values($qteFinal);
$article= array_values($articleFinal);