给定属性值的对象中项目的PHP计数
如何计算具有相同文件夹id的项目数 以下是我的物品清单:给定属性值的对象中项目的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
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;
}
));
}