1

我完全被这个难住了。我试图弄清楚我可以计算对象数组中特定键的出现次数。

这是数组:

Array 
(
[0] => stdClass Object
    (
        [id] => 1
        [user_id] => 1
        [group_id] => 1
        [cat_0] => foo
        [cat_1] => bar
        [cat_2] => 
        [cat_3] => 
    )
)

您会看到 cat_ 出现了四次,但末尾的数字从 0 到 3 不等。这个数字可能会改变并且是动态的,所以我需要一种方法来弄清楚如何为“cat_”的 4 个键返回 4 的计数。有什么想法吗?或者一个好的方向来指出我?

提前致谢。

4

4 回答 4

3
$count = 0;
foreach ($myObj as $key => $value) {
    if (strpos($key, 'cat_') === 0) {
        $count++;
    }
}

你真的应该'cat'用子键制作一个数组,这更容易使用。

于 2012-12-10T19:27:19.087 回答
1

这是一个单行选项

$catCount = count(preg_grep("/^cat_(\d)+$/", array_keys(get_object_vars($yourObj))));

preg_grep可以通过阵列扫描模式

参考:https ://stackoverflow.com/a/1337711/138383

于 2012-12-10T19:34:40.727 回答
0

简单案例的伪代码:

for all keys:
1. Get the key
2. Apply regex to check if the key matches your prefix
3. if yes ++1 your result

如果您需要查找前缀未知的重复项,这意味着您可以拥有以下内容:

[random-prefix1_1] => v1
[random-prefix1_2] => v2
[random-prefix1_3] => v3
[random-prefix2_1] => v4
[random-prefix2_2] => v5

然后您可以反向执行此操作,这意味着您可以搜索后缀 (_[0-9]+) 的键并将其删除,然后计算相同的键(按字母顺序排列并查找某个键与下一个键不同的时间)

如果前缀和后缀都不知道,那你就有问题了 :)

于 2012-12-10T19:36:48.777 回答
0

您可以使用 for 循环形式的简单逻辑。下面的代码适用于数组,如果您想使用 obj ->

    $j =1 ;
    for ($i=0;$i<$j;$i++){ //note here we consider that cat_0 is always there and if not then check isset out of for loop cat_0 exist then only go inside loop
          echo 'O/P : '.$val['cat_'$i];
          if (isset($val['cat_'.(int)($i+1)])){
               $j++;
          }
    }

最后 $j 包含最后一个值(总计)。这将适用于 n 个 cat_ 。

于 2016-04-05T07:33:07.667 回答