2012-03-19 5 views
1

У меня есть многомерный массив:многомерный массив: Как построить рекурсивный подсчет()

membership = array(5) { 
[0]=> array(4) { [0]=> string(21) "Group A" [1]=> string(9) "10/1/2011" [2]=> string(9) "3/31/2012" [3]=> string(8) "00004130" } 
[1]=> array(4) { [0]=> string(22) "Group B" [1]=> string(8) "4/1/2011" [2]=> string(9) "9/30/2011" [3]=> string(8) "00005005" } 
[2]=> array(4) { [0]=> string(22) "Group A" [1]=> string(9) "10/1/2010" [2]=> string(9) "3/31/2011" [3]=> string(8) "00004130" } 
[3]=> array(4) { [0]=> string(22) "Group B" [1]=> string(8) "4/1/2010" [2]=> string(9) "9/30/2010" [3]=> string(8) "00005005" } 
[4]=> array(4) { [0]=> string(22) "Group B" [1]=> string(8) "10/1/2010" [2]=> string(9) "3/31/2011" [3]=> string(8) "00005005" } 
} 

Мне нужно, чтобы обнаружить, какая группа находится в массиве членства и сколько раз он появляется ,

РНР отсчет() не имеет рекурсивную возможности, но его вывод был бы идеальным, если он сделал (т.е. [ 'Группа A'] => 2 [ 'Группа B'] => 3).

Я думал об использовании array_diff_uassoc(), но я просто не уверен. Поэтому я подумал, что разумно просить о помощи, прежде чем я бесцельно блуждаю по неправильному пути. Я уверен, что существует более одного пути, но я всегда нахожу очень интересные концепции кодирования на SO.

Я работаю php 5.3.5 Заранее благодарю за ваши предложения и помощь.

+3

'Количество РНР() не имеет рекурсивный capability' да? Изучите руководство по 2-му аргументу 'count's'. В любом случае, он не будет делать то, что вы хотите, просто используйте 'foreach' и все. –

+0

данные поступают из db? –

+1

Поскольку все они на одной глубине, зачем вам это нужно, чтобы быть рекурсивным? Возможное повторное использование в будущем? – Rick

ответ

2

Это должно сделать трюк с минимальным кодом:

$memberships = array(); // Your multi-dimensional array 

foreach($memberships as $membership) 
{ 
    $count[$membership[0]]++; 
} 

var_dump($count) 

Извините за поздний пост Кстати, я хотел test it и сделать уверен, что он будет работать так, как ожидалось.

Выход:

array(2) { 
    ["Group A"]=> 
    int(2) 
    ["Group B"]=> 
    int(3) 
} 
+0

Спасибо! Хороший, чистый, простой. Спасибо, что нашли время! – Ricalsin

+0

И спасибо за результаты теста Ideone.com! Я уже видел этот сайт в моих поисках. Это выглядит интересно. Благодарю. – Ricalsin

+0

Да, я только начал использовать его в последнее время. Это очень удобно для тестирования небольших фрагментов кода, чтобы убедиться, что решение действительно будет работать. –

1

учитывая то, что у вас есть, это он. даже не нужно быть рекурсивным, так как ваш массив является только 2D

<?php 
$membership = array( 
    array("Group A","10/1/2011","3/31/2012","00004130"), 
    array("Group B","4/1/2011","9/30/2011","00005005"), 
    array("Group A","10/1/2010","3/31/2011","00004130"), 
    array("Group B","4/1/2010","9/30/2010","00005005"), 
    array("Group B","10/1/2010","3/31/2011","00005005") 
); 

//initialize array for safety 
$count = array(); 

//loop through each item 
foreach($membership as $row){ 

    //check if group exists in count array 
    $group = $row[0]; 
    $groupExists = array_key_exists($group,$count); 

    if($groupExists){ 
     //if we've crossed paths before, just add 1 
     $count[$group]++; 
    } else { 
     //otherwise, let's start with 1 
     $count[$group]=1; 
    } 
} 

var_dump($count); 

//output dump should look like 
array(2) { 
    ["Group A"]=> int(2) 
    ["Group B"]=> int(3) 
} 
+0

Спасибо, что нашли время, Джозеф. Циллоз был просто проще, но я ценю урок на вашем посту. Еще раз спасибо! – Ricalsin