Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
给定属性值的对象中项目的PHP计数_Php_Arrays_Object_Foreach_Count - Fatal编程技术网

给定属性值的对象中项目的PHP计数

给定属性值的对象中项目的PHP计数,php,arrays,object,foreach,count,Php,Arrays,Object,Foreach,Count,如何计算具有相同文件夹id的项目数 以下是我的物品清单: 项目id=1,文件夹id=1 项目id=2,文件夹id=1 项目id=3,文件夹id=2 项目id=4,文件夹id=3 这是我的更新的代码: foreach($items as $item) { if(????) //count of $item->folder_id > 1 { //do something to $item->folder_id=1/$item->item

如何计算具有相同文件夹id的项目数

以下是我的物品清单:

  • 项目id=1,文件夹id=1
  • 项目id=2,文件夹id=1
  • 项目id=3,文件夹id=2
  • 项目id=4,文件夹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
           }
    }
    
    我感兴趣的代码可以告诉我,文件夹\u id=1的计数是2,文件夹\u id=2的计数是1,文件夹\u id=3的计数也是1

    更新:我将上面的代码更改为现在包含一个elseif(),因为它没有询问我感兴趣的所有内容。除了计算每个文件夹id的#之外,我还对区分文件夹id!=item_id。这将把item_id=1、item_id=2、item_id=3/4放在它们自己的条件子句中,并且不会像以前那样将item_id=1和item_id=2混为一谈


    非常感谢您提供的任何帮助,

    如果您有一组文件夹ID,您可以使用这些ID提供您所需的准确结果。让我们使用以下方法从对象数组中创建一个类似的数组:

    这将导致
    $result
    被删除

    array(
        1 => 2,
        2 => 1,
        3 => 1,
    );
    
    您还可以为一行程序内联编写回调函数,或者如果您使用的是PHP<5.3,则可以将其作为自由函数编写,或者使用
    create\u function

    (PHP版本<5.3)

    更新:跟进

    给定上面的
    $results
    ,您的循环将是:

    foreach($results as $folder_id => $count) {
        if($count > 1) {
            // There were $count items with folder_id == $folder_id
        }
        // else blah blah
    }
    

    我想这就是你要找的

    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
        }
    }
    

    $items在您的函数中来自何处?此代码将不起作用。$items是我的对象,其中包含item_id和folder_id属性。我认为这是一个全局变量,但我已将代码修复为一个函数。您好,Matt,谢谢您的帮助,您能否继续介绍如何将folder_count()集成到我感兴趣的if()语句中?谢谢-Timnogood谢谢你修正了你的答案。这是一个非常优雅的方式,但你可以解释一下你的代码的作用。@Iznogood它只是在
    $items
    上迭代,给每个同名的成员添加一个(也就是
    $item->folder_id
    )。嗨,Alex,我不知道如何为每个文件夹id使用$totals。意思是,我可以把它放在if()语句中$totals>1吗?谢谢你的帮助-tim@alex我知道它做了什么,但并没有期望每个人都能理解。@Timperson只是有另一个foreach:foreach($items as$item){if($totals[$item->folder\u id]>1){do\u wathever;..}否则{do\u other\u things;..}}嗨,Jon,谢谢你的帮助,你能帮我找出如何将$result放入if()我感兴趣的声明?谢谢-timHi Jon,请看我在上面的评论,我将在这里重复:我可以再添加一条皱纹吗?我如何区分项目_id=1和项目_id=2?目前,两者都将放在if()语句中。如果在if()语句中需要item_id=1,在elseif()语句中需要item_id=2,在else{}语句中需要item_id=3和item_id=4,该怎么办。在if()语句中包含一个&&$item->folder\u id==$item->item\u id以及$totals[$item…对我来说不起作用。谢谢!-tim
    $totals = array();
    
    foreach($items as $item) {
       $totals[$item->folder_id]++;
    }
    
    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
        }
    }
    
    function count_items(Array $items, $folder_id) {
        return count(array_filter($items, 
            function($item) use($folder_id) {
                return $item->folder_id === $folder_id;
            }
         ));
    }