2013-08-11 3 views
2

Je suis un designer travaillant sur un projet d'allumeur de code et je suis bloqué sur ce problème!Tri, regroupement et comptage d'un tableau PHP

Je possède ce tableau

Array 
(
    [Science] => 7 
[War] => 5 
[Mystery] => 2 
[Preview Only] => 2 
[Conspiracy,News ] => 2 
[Drugs,Educational,Lifestyle,Society] => 1 
[Educational,Nature,Science,Space] => 1 
[Religion,Society] => 1 
[Music] => 1 
[Movies,Music] => 1 
[Lifestyle] => 1 
[Countries,Educational,History,War] => 1 
[Educational,Society] => 1 
[Science,Space,Technology] => 1 
[Economics,Educational,Lifestyle,Society] => 1 
[Society] => 1 
[Biology,Conference,Educational] => 1 
[Human Rights,Society] => 1 
[Art and Artists,Biographies,Music] => 1 
[Biology,Educational,Science] => 1 
[Activist,Biology,Science,Society] => 1 
[Countries,Drugs,War] => 1 
[Drugs,War] => 1 
[Technology,War] => 1 
[History,War] => 1 
[Biology,Educational,Environment,Nature,Science] => 1 
[Science,Technology] => 1 
[Educational,Science,Space] => 1 
[Educational,History,Human Rights,War] => 1 
[Environment] => 1 
[Biographies] => 1 
[Evolution,Science] => 1 
[Art and Artists] => 1 
) 

Comme vous pouvez le voir là, il est déjà commandé par un certain nombre. Ce que je voudrais réaliser consiste à supprimer toutes les catégories en double du tableau et l'ajout d'un +1 à chaque catégorie, me laissant avec ce résultat:

Array 
(
[Science] => 14 
[War] => 11 
[Mystery] => 2 
[Preview Only] => 2 
[Conspiracy] => 2 
[Society] => 4 
[Nature] => 1 
[space] => 1 
[Religion] => 1 
[Music] => 2 
[Movies] => 1 
[Lifestyle] => 1 
[Countries] => 1 
[Educational] => 12 
[Space] => 1 
[Lifestyle] => 1 
[Society] => 3 
[Biology] => 3 
[Economics] => 1 
[Science] => 1 
[Activist] => 1 
[Countries] => 1 
[Drugs] => 3 
[Technology] => 2 
[History] => 1 
[Biology] => 1 
[Technology] => 1 
[Space] => 1 
[History] => 1 
[Human Rights] => 
[Environment] => 1 
[Biographies] => 2 
    [Evolution] => 1 
    [Art and Artists] => 1 
) 

Les exemples ne correspondent pas parfaitement, mais vous pouvez voir ce que je suis essayant d'accomplir. MERCI TOUT LE MONDE!!!

+0

Si l'importance est de savoir si une combinaison (par exemple [Activist, Biology, Science, Society]) peut avoir une valeur supérieure à 1? – Wrikken

Répondre

1

Pour obtenir la clé du premier tableau, explode() pour couper les virgules, puis, si explode a donné plus d'un élément Nouveau.

Cette une première version, même pas testé:

$array1 = array(); // The array you show 
    $array2 = array(); // The resulting array 

    $keys = array_keys($array1); 
    foreach($keys as $key) 
    { 
     $chunks = explode(',', $key); 
     foreach($chunks as $chunk) 
     { 
      if(isset($array2[$chunk])) 
       $array[$chunk] += $array1[$key]; 
      else 
       $array[$chunk] = $array1[$key]; 
     } 
    } 
+0

Eh bien, votre première réponse était en quelque sorte correcte, cependant, l'exemple de code que vous avez édité est _not_ (codé en dur '1' n'est pas le chemin à parcourir). – Wrikken

+0

Je l'ai fait dans le moment, et, comme vous le montrez, il y a des valeurs précédentes, je vais le changer maintenant. – markmb

1
function do_the_magic($array){ 
$result = array(); 
foreach ($array as $k=>$value){ 
    foreach (explode(',',$k) as $category){ 
    $result[$category] += $value; 
    } 
} 
return $result; 
} 

exemple:

$a['ala,ma']=1; 
$a['ala']=2; 
print_r(do_the_magic($a)); 

résultats dans

Array ( 
[ala] => 3 
[ma] => 1 
) 
1

Essayez quelque chose comme ceci:

$result = array(); 
foreach($data as $str_keys => $value) { 
    $keys = explode(',', $str_keys); 
    foreach($keys as $key) { 
     if(isset($result[$key])) { 
      $result[$key] += $value; 
     } else { 
      $result[$key] = $value; 
     } 
    } 
} 

print_r($result); 
+0

Cela a fonctionné PARFAITEMENT! Exactement ce dont j'avais besoin, merci. – dallardtech