2013-08-11 2 views
2

Я дизайнер, работающий над проектом воспламенения кода, и я застрял в этой проблеме!Сортировка, группировка и подсчет массива PHP

У меня есть этот массив

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 
) 

Как вы можете видеть, что он уже заказал ряд. То, что я хотел бы достичь удаляет повторяющиеся категории из массива и добавить +1 к каждой категории, оставив меня с этим результатом:

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 
) 

примеры не вполне совпадают, но вы можете увидеть, что я пытаясь добиться. ВСЕМ СПАСИБО!!!

+0

Если значение имеет значение, например, комбинация («Активист, биология, наука, общество») может иметь значение более 1? – Wrikken

ответ

1

Вы можете использовать array_keys(), чтобы получить ключ первого массива, explode(), чтобы вырезать запятые, а затем, если взорвался, дал более одного элемента, проверьте, существует ли этот элемент или нет, и увеличивайте его на единицу или создайте новый.

Это первая версия, даже не проверяла:

$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

Ну, ваш первый ответ был скорее правильным, однако, код, который вы отредактировали, - _not_ (hardcoded '1' - это не путь). – Wrikken

+0

Я сделал это в данный момент, и, как вы указываете, есть предыдущие значения, я сейчас его изменю. – markmb

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

пример:

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

приводит

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

Попробуйте что-то вроде этого:

$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

Это работало СОВЕРШЕННО! Именно то, что мне нужно, спасибо. – dallardtech

Смежные вопросы