2013-09-08 2 views
1

Voici mon tableau initial:tableaux PHP aplatissent tableau multidimensionnel par clé

$arr = array(
array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'), 
array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'), 
array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'), 
array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'), 
array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'),  
array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'),  
array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'), 
array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'),  
array('model'=>'678', 'brand'=>'', 'title'=>'ccc') 
);  

Je voudrais arriver à:

$result = array(
array('model'=>'123', 'garment'=>'coat', 'gender'=>'men', 'brand'=>'adidas', 'title'=>'aaa'), 
array('model'=>'345', 'garment'=>'jacket', 'gender'=>'kids', 'brand'=>'nike', 'title'=>'bbb'), 
array('model'=>'678', 'garment'=>'trainers', 'gender'=>'kids', 'brand'=>'', 'title'=>'ccc') 
) 

Voulez-vous s'il vous plaît bien vouloir me aider - je vous remercie. Voici ma tentative de solution, mais je manque de mémoire lorsque j'essaie de trouver de grandes baies.

Voici l'étape 1:

//---------------------- STEP 1 ------ 
$result = array(); 
foreach($arr as $line) { 
    $result[] = $line['model']; 

} 

$result = array_values(array_unique($result)); 

Voici l'étape 2:

//---------------------- STEP 2 ------ 
foreach($result as $r) { 
    $inter = array(); 

    $inter['model'] = $r; 

    foreach($arr as $line) { 
     if ($r == $line['model']){ 
      if (!isset($inter['title']) && isset($line['title'])) { 
       $inter['title'] = $line['title']; 
      }        
      if (!isset($inter['garment']) && isset($line['garment'])) { 
       $inter['garment'] = $line['garment']; 
      } 
      if (!isset($inter['gender']) && isset($line['gender'])) { 
       $inter['gender'] = $line['gender']; 
      }  
       if (!isset($inter['brand']) && isset($line['brand'])) { 
         $inter['brand'] = $line['brand']; 
       } 
     } 
    } 

    if (!isset($inter['title'])) { 
     $inter['title'] = ''; 
    } 
    if (!isset($inter['garment'])) { 
     $inter['garment'] = ''; 
    } 
    if (!isset($inter['gender'])) { 
     $inter['gender'] = ''; 
    } 
    if (!isset($inter['brand'])) { 
     $inter['brand'] = ''; 
    } 


    $results[] = $inter; 
    unset($inter); 
} 

unset($result); 
return $results; 
+0

est "modèle" une sorte de code unique? – DonCallisto

+0

Utilisez une simple boucle 'foreach' .... – Baba

+0

yeap. dans le et j'ai une liste de valeurs uniques de '123', '345' et '678' et les paramètres associés à côté d'eux – user2757798

Répondre

0
<?php 

$arr = array(
array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'), 
array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'), 
array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'), 
array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'), 
array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'), 
array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'), 
array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'), 
array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'), 
array('model'=>'678', 'brand'=>'', 'title'=>'ccc') 
); 

$new_arr = array(); 

foreach ($arr AS $tmp) { 
    $this_model = $tmp['model']; 
    if (!isset($new_arr[$this_model])) { $new_arr[$this_model] = array(); } 
    $new_arr[$this_model] = array_merge($new_arr[$this_model], $tmp); 
} 
print '<pre>'; 
var_dump($new_arr); 
print '</pre>'; 
?> 
+0

Mais cela ne fonctionnera pas/ne fonctionne jamais pour 'title', parce que seule la dernière valeur (écrasée) restera. – djot

+0

tester cette solution ... – user2757798

+0

Ce que je voulais dire avec mon commentaire est, vous ne pouvez pas l'aplatir comme ça si le titre est différent [123]: title = 'a', [123]: title = 'b' ... seulement 'b' sera laissé et 'a' sera perdu. – djot

1
$arr = array(
array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'), 
array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'), 
array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'), 
array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'), 
array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'),  
array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'),  
array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'), 
array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'),  
array('model'=>'678', 'brand'=>'', 'title'=>'ccc') 
); 
//var_dump($arr); 
$arrRes = array(); 
$arrSort = array(); 

foreach($arr as $key => $v){ 

$key = array_search($v["model"],$arrSort,true); 
if($key === false){ 
    //key empty , insert model 
    $arrRes[] = $v; 
    $arrSort[] = $v["model"]; 
    } 
else{ 

    foreach($v as $subKey => $subv){ 
     if($subKey!="model"){  
      $arrRes[$key][$subKey] = $subv; 
     } 
    } 
} 

} 
echo "<pre>"; 
var_dump($arrRes); 
echo "</pre>"; 

J'ai essayé sur 8000 lignes, si votre boucle est à court de mémoire, clairement il a également des erreurs de logique , je ne pense pas que vous pouvez conserver le même nom de clé de chaîne dans un tableau.

+0

fonctionne comme un charme. Merci infiniment! J'ai encore un problème avec la mémoire + error.log montre "signal Segmentation fault (11)". Au moins, cela montre que cela ne concerne pas le code lui-même, mais plutôt les paramètres de mémoire. Creusera plus profond – user2757798

+0

si vous trouvez cette réponse est utile, donnez-moi une coche verte montrer la réponse est correcte, merci – Norman

0

Ma méthode suppose que les sous-réseaux d'entrée sont dans des lots de 3
Le premier tableau associatif vide dans array_replace() sert à établir l'ordre de clé désiré par l'OP.
J'utilise un opérateur splat ... donc php5.6 + est requis.
L'opérateur splat délivre les trois sous-matrices dans le bloc à la fois.

code: (Demo)

$arr = array(
    array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'), 
    array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'), 
    array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'), 
    array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'), 
    array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'),  
    array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'),  
    array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'), 
    array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'),  
    array('model'=>'678', 'brand'=>'', 'title'=>'ccc') 
); 
$key_order=['model'=>'','garment'=>'','gender'=>'','brand'=>'','title'=>'']; 
foreach(array_chunk($arr,3) as $a){ 
    $result[]=array_replace($key_order,...$a); 
} 
var_export($result); 

Sortie:

array (
    0 => 
    array (
    'model' => '123', 
    'garment' => 'coat', 
    'gender' => 'men', 
    'brand' => 'adidas', 
    'title' => 'aaa', 
), 
    1 => 
    array (
    'model' => '345', 
    'garment' => 'jacket', 
    'gender' => 'kids', 
    'brand' => 'nike', 
    'title' => 'bbb', 
), 
    2 => 
    array (
    'model' => '678', 
    'garment' => 'trainers', 
    'gender' => 'kids', 
    'brand' => '', 
    'title' => 'ccc', 
), 
) 
Questions connexes