【问题标题】:How to print count of unique values in CakePHP如何在 CakePHP 中打印唯一值的计数
【发布时间】:2013-03-08 18:42:48
【问题描述】:

我正在尝试返回每个 $models['location'] 中有多少值的计数。我想出了下面的代码来做到这一点,它有点工作,问题是第一个计数返回 0。

这是一个输出示例:0in7B 27in7C 40in8A 36in8B 40in8C。现在这几乎是正确的,但确实有27in7B 40in7C 36in8A 等等。有谁知道我在这里做错了什么或更好的方法?

<?php
    $locations = array();
    foreach($subcategory['Product'] as $models) {
        if ( in_array($models['location'], $locations) ) {
            $i++;
            continue;
        } 
        $locations[] = $models['location'];
        echo $i . "in" . $models['location'] . " ";
        $i = 1;
    }
?>

var_dump($models['location']) 返回:

string(2) "7B" 0in7B string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7B" string(2) "7C" 27in7C string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "7C" string(2) "8A" 40in8A string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8A" string(2) "8B" 36in8B string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8B" string(2) "8C" 40in8C string(2) "8C" string(2) "8C" string(2) "8C" string(2) "8C" string(2) "8C" string(2) "8C" 

【问题讨论】:

  • 你为什么在$models['location']而不是$locations上做var_dump?

标签: php arrays cakephp foreach counter


【解决方案1】:

编辑:这个解决方案与你的有点不同,但它有效,我已经测试过了。

另请注意,“算法”保持 O(N)。即使您必须执行第二次 foreach 才能遍历数组,但第二次包含的元素远少于 N 个元素,因此它仍然是 N 类型。

$locations = array();
foreach($subcategory['Product'] as $models) {
    if(isset($locations[$models['location']])){
       $locations[$models['location']] += 1;
    } else {
       $locations[$models['location']] = 1;
    }
}

你会得到一个包含所有计数的数组。您所要做的就是打印出来。

它的作用可能看起来很奇怪,但实际上很简单。您检查数组并检查条目是否已经存在。如果是,则在该位置增加值,否则将值初始化为 1。

数组将以位置字符串作为键。


你也可以把它写成一个简短的 if :

$locations = array();
foreach($subcategory['Product'] as $models) {
    isset($locations[$models['location']]) ? $locations[$models['location']] += 1 : $locations[$models['location']] = 1;
}

回声示例:

 foreach($locations as $key => $count) {
     echo "$count in $key <br />";
 }

【讨论】:

  • 我一开始尝试过,但它只是给第一个计数一个 1
  • @rubyme8 已更新。这与您的解决方案有点不同,但即使数组一开始没有排序也可以工作。
  • 非常感谢!这完全符合我的需要!我将不得不研究您的答案一段时间,以更好地了解其工作原理。谢谢!
  • @rubyme8 很高兴我能帮上忙!
【解决方案2】:

这可能是因为i 在您开始迭代时未定义,请尝试将$i = 0; 放在foreach 开始之后。

【讨论】:

  • 当然,这是一个愚蠢的建议。 var_dump($models['location'])foreach 之后开始查看其中的内容,可能第一个$models['location'] 不在$locations 中,因此打印为0。
  • 我刚刚用 var_dump 的输出更新了我的问题,有什么想法吗?
猜你喜欢
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多