PHP количество элементов в объекте данного значения свойства - PullRequest
0 голосов
/ 27 октября 2011

Как подсчитать количество элементов с одинаковым идентификатором папки #?

Вот мой список элементов:

  1. item_id = 1, folder_id = 1
  2. item_id = 2, folder_id = 1
  3. item_id = 3, folder_id = 2
  4. item_id = 4, folder_id = 3

Вот мой ОБНОВЛЕНО код:

foreach($items as $item)
{
    if(????) //count of $item->folder_id > 1
       {
         //do something to $item->folder_id=1/$item->item_id=1
       }

       elseif(????) // cases where $item->item_id != $item->folder_id
       { 
         //do something else to $item->folder_id=1/$item->item_id=2
       }

       else
       { 
         //do something else to $item->folder_id=2/$item->item_id=3 and folder_id=3/item_id=4
       }
}

Мне интересен код, который может сказать мне, что счетчик для folder_id = 1 равен 2, счетчик для folder_id = 2 равен 1, а счетчик для folder_id = 3 равентакже 1.

ОБНОВЛЕНИЕ: Я изменил приведенный выше код и теперь включаю elseif (), потому что он не совсем задал все вещи, которые меня интересовали. Помимо подсчета #для каждого folder_id меня также интересует различение случаев, когда folder_id! = item_id.Это поместит item_id = 1, item_id = 2, item_id = 3/4 в их собственные условные предложения и не будет объединять item_id = 1 и item_id = 2, как раньше.

Любая помощь будет принята с благодарностью, спасибовы,

Ответы [ 4 ]

1 голос
/ 27 октября 2011

Если у вас есть массив folder_ids, вы можете использовать array_count_values, чтобы получить именно тот результат, который вам нужен.Итак, давайте сделаем такой массив из массива объектов, используя array_map:

$callback = function($item) { return $item->folder_id; };
$result = array_count_values(array_map($callback, $items));

В результате $result будет

array(
    1 => 2,
    2 => 1,
    3 => 1,
);

Вы также можете написать обратный вызов для одной строки, или, если вы используете PHP <5.3, вы можете написать его как бесплатную функцию или, альтернативно, использовать <code>create_function.

См.это в действии (версия для PHP <5.3). </p>

Обновление: продолжение

Учитывая $results сверху, ваш цикл будет:

foreach($results as $folder_id => $count) {
    if($count > 1) {
        // There were $count items with folder_id == $folder_id
    }
    // else blah blah
}
0 голосов
/ 27 октября 2011
function count_items(Array $items, $folder_id) {
    return count(array_filter($items, 
        function($item) use($folder_id) {
            return $item->folder_id === $folder_id;
        }
     ));
}
0 голосов
/ 27 октября 2011

Я думаю, это то, что вы ищете.

function folder_count($items, $num)
{
    $cnt = 0;
    foreach($items as $item)
    {
        if($item->folder_id > $num)
        {
            $cnt++;
        }
    }
    return $cnt;
}

foreach ($items as $item)
{
    if (folder_count($items, 1))
    {
        //do something to $item->folder_id=1/$item->item_id=1, item_id=2
    }
    else
    { 
        //do something else to $item->folder_id=2/$item->item_id=3 and folder_id=3/item_id=4
    }
}
0 голосов
/ 27 октября 2011
$totals = array();

foreach($items as $item) {
   $totals[$item->folder_id]++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...