2009-08-19 2 views
1

я есть Еогеасп, которые генерируют следующие массивы:отсчет от нескольких многомерных массивов

==== array 1 ==== 
array 
    0 => 
    array 
     'tag' => string 'daf' (length=3) 
    1 => 
    array 
     'tag' => string 'daa' (length=3) 
    2 => 
    array 
     'tag' => string 'daf' (length=3) 
    3 => 
    array 
     'tag' => string 'daaa' (length=4) 
    4 => 
    array 
     'tag' => string 'daf' (length=3) 
    5 => 
    array 
     'tag' => string 'daa' (length=3) 
    6 => 
    array 
     'tag' => string 'daf' (length=3) 
    7 => 
    array 
     'tag' => string 'daf' (length=3) 
    8 => 
    array 
     'tag' => string 'daf' (length=3) 
    9 => 
    array 
     'tag' => string 'abd' (length=3) 
    10 => 
    array 
     'tag' => string 'abdaa' (length=5) 
    11 => 
    array 
     'tag' => string 'abda' (length=4) 

==== array 2 ====  
array 
    0 => 
    array 
     'tag' => string 'daf' (length=3) 
    1 => 
    array 
     'tag' => string 'test1' (length=5) 

Как выход я хочу, чтобы получить что-то вроде:

array 
    'daf' => '7' 
    'daa' => '2' 
    'daaa' => '1' 
    'abd' => '1' 
    'abdaa' => '1' 
    'abda' => '1' 
    'test1' => '1' 

Значение нового массива является счетчиком элемент из всего генератора генерирует из цикла. array_count_values ​​() здесь не работает ... любые предложения, как решить проблему?

+0

Есть ли причина, по которой array1 и array2 являются двумерными? – VolkerK

+0

да, я хочу, чтобы потом расширять массивы в форме 'test1' => array ('count' => '1', 'uri' => 'http: // testuri') – cupakob

ответ

2

Нечто подобное должно работать:

$result = array(); 
foreach (array_merge($array1, $array2) as $item) { 
    $name = $item['tag']; 
    if (!isset($result[$name])) { 
     $result[$name] = 0; 
    } 

    $result[$name]++; 
} 
4

Не заметил это было 2 одномерный массив.

Вот еще один код.

var_export(
    array_count_values(
     call_user_func_array('array_merge', array_merge($array1, $array2)) 
    ) 
); 
+0

Nice. Я узнал о новой функции. – easement

+0

Красота, мне нравится, как вы использовали call_user_func_array(), чтобы сгладить массив. – bucabay

2

Давайте воспользуемся Standard PHP Library (SPL).
Вы можете «сгладить» массив с помощью RecursiveArrayIterator и RecursiveIteratorIterator. В результате вы получаете итератор, который посещает каждый лист вашего n-мерного массива и до сих пор позволяет вам получить доступ к фактическому ключу элемента. На следующем шаге выполните как рекурсивные Итераторы с AppendIterator, действующие как один интернатор, который посещает каждый элемент во всех своих внутренних (добавленных) итераторах.

$ai = new AppendIterator; 
$ai->append(new RecursiveIteratorIterator(new RecursiveArrayIterator($array1))); 
$ai->append(new RecursiveIteratorIterator(new RecursiveArrayIterator($array2))); 
$counters = array(); 
foreach($ai as $key=>$value) { 
    if ('tag'===$key) { 
    // @ because I don't care whether this array element exists beforehand or not. 
    // $value has to be something that can be used as an array key (strings in this case) 
    @$counters[$value] += 1; 
    } 
} 

Если вы хотите, вы можете даже использовать FilterIterator вместо if('tag'===$key). Но imho это не повышает читаемость/значение кода ;-)

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