【问题标题】:How to count specific number of a certain key in an object array如何计算对象数组中某个键的特定数量
【发布时间】:2012-12-10 19:23:47
【问题描述】:

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

这是数组:

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 的计数。有什么想法吗?或者一个好的方向来指点我?

提前致谢。

【问题讨论】:

  • 初始化一个计数器。遍历数组中的每个值,检查它是否以cat_ 开头,如果是,则增加一个计数器。
  • 数组可以包含多个对象吗?如果是这样,您是否要计算所有出现的 cat_*、最大值或其他值?
  • 数组如上图,cat_出现的最大次数
  • 嗯。 . .那么为什么您的对象在单个元素数组中?如果您修改它们以处理数组元素 0 ,下面的大多数答案都将起作用。 . .

标签: php regex arrays count


【解决方案1】:
$count = 0;
foreach ($myObj as $key => $value) {
    if (strpos($key, 'cat_') === 0) {
        $count++;
    }
}

你真的应该让 'cat' 成为一个带有子键的数组,这样更容易使用。

【讨论】:

  • 此外,如果您只需要计算具有值的字段,您可以检查$value !== null
  • @K_G 仅当您不知道如何正确应用它时。为我工作:3v4l.org/Q3k94
  • 这应该可以工作,如果 $myObj 是 $myArray[0] - OP 有一个包含对象的数组。
  • 是的,我将其更改为 $array[0] 并且有效。谢谢厄尼。
【解决方案2】:

这是一个单行选项

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

preg_grep 可以通过数组扫描模式

引用:https://stackoverflow.com/a/1337711/138383

【讨论】:

  • 这是一个对象,而不是一个数组。 . .可能使用 get_object_vars 而不是 array_keys。这也仅在索引不稀疏时才有效。
  • 在那个上面扫描,似乎get_object_vars 明白了。更新代码
  • @K_G 您是否将$yourObj 设置为您的数组或对象值?
  • 甚至将(对象)添加到数组变量的开头,仍然返回零计数
  • 可能将其更改为 $yourObj[0],因为 OP 似乎只想复制和粘贴代码,而不是尝试阅读/理解它可能会失败的原因。 . .
【解决方案3】:

简单案例的伪代码:

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]+) 的键并将其删除,然后计算相同的键(按字母顺序并查找一个键与下一个不同的键例如)

如果前缀和后缀都是未知的,你有问题:)

【讨论】:

    【解决方案4】:

    你可以使用 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-12-06
      • 2020-04-27
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 2020-06-30
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多