Как подсчитать, сколько массивов имеют одинаковое имя в многомерном массиве с помощью php?

У меня есть многомерный массив, и в нем будет несколько массивов. Некоторые из этих массивов также содержат несколько массивов внутри них, и я хотел бы подсчитать, сколько массивов находится во втором массиве (дата).

Это пример структуры многомерного массива:

$_SESSION['final_shipping'][04/03/2010][book]
$_SESSION['final_shipping'][04/12/2010][magazine]
$_SESSION['final_shipping'][04/12/2010][cd]

Это оператор foreach, который я сейчас использую, чтобы подсчитать, сколько существует второго массива (тот, что с датами).

foreach($_SESSION['final_shipping'] as $date_key => $date_value) { 
    foreach ($date_value as $product_key => $product_value) { 
        echo 'There are ' . count($date_key) . ' of the ' . $date_key . ' selection.<br/>';
    }
}

В настоящее время выводит это:

Есть 1 из подборки от 03.04.2010.
Есть 1 из подборки от 12.04.2010.
Есть 1 из подборки от 12.04.2010.

Я хотел бы, чтобы он выводил это:

Есть 1 из подборки от 03.04.2010.
Есть 2 из подборки от 12.04.2010.


person zeckdude    schedule 07.04.2010    source источник


Ответы (3)


Вместо этого вызовите count() для $date_value, поскольку вы хотите подсчитать количество элементов в значении массива, сопоставленном с этим ключом, а не размер самого ключа.

foreach($_SESSION['final_shipping'] as $date_key => $date_value) {
    echo 'There are ' . count($date_value) . ' of the ' . $date_key . ' selection.<br/>';
}
person Amber    schedule 07.04.2010

Вы считаете неверный варибале, он должен быть $date_value

foreach($_SESSION['final_shipping'] as $date_key => $date_value) { 
    echo 'There are ' . count($date_value) . ' of the ' . $date_key . ' selection.<br/>';
}
person Lizard    schedule 07.04.2010

С таким многомерным массивом:

$data = array(
    'item1' => array(
        'item1-1' => array( 'foo' => 1,'bar' => 1 ),
        'item1-2' => array( 'bar' => 1 ),
    ),
    'item2' => array( 
        'item2-1' => array('foo' => 1 )
    )
);

Вы можете создать RecursiveIteratorIterator и RecursiveArrayIterator

$it = new RecursiveIteratorIterator(
        new RecursiveArrayIterator($data),
        RecursiveIteratorIterator::SELF_FIRST);

а затем легко перебрать его с помощью foreach

foreach($it as $key => $val) {
    if(is_array($val)) {
        printf('There is %d of %s%s', count($val), $key, PHP_EOL);
    }
}

получать

There is 2 of item1
There is 2 of item1-1
There is 1 of item1-2
There is 1 of item2
There is 1 of item2-1

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

foreach($it as $key => $val) {
    if(is_array($val) && $it->getDepth() === 1) {
        printf('There is %d of %s%s', count($val), $key, PHP_EOL);
    }
}

получать

There is 2 of item1-1
There is 1 of item1-2
There is 1 of item2-1
person Gordon    schedule 07.04.2010
comment
Приятно видеть, что такой подход встречается в ответах, но приведенный пример не особенно применим к вопросу. - person salathe; 07.04.2010
comment
@salathe, как ты думаешь, чего не хватает? - person Gordon; 07.04.2010
comment
Я предполагаю, что главное - удовлетворить запрос на подсчет количества массивов во втором массиве (дата), а не общее решение для подсчета всех уровней. - person salathe; 07.04.2010
comment
@salathe Я добавил это. Но я согласен, что вышеизложенное немного излишне в случае с OP, поскольку на самом деле он рассчитывает не на многомерный уровень, а только на массивы на одном уровне. - person Gordon; 07.04.2010