2013-03-08 23 views
1

我试图返回每个$ models ['location']中有多少个值的计数。我已经拿出下面的代码来做到这一点,它的工作原理,问题是第一个计数返回0.如何在CakePHP中打印唯一值的计数

下面是一个输出示例: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($模式[ '位置'])返回:

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" 
+0

为什么要那样做的'$车型的var_dump [ '位置']'而不是'$ locations'? – Dave 2013-03-08 19:28:38

回答

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.

该数组将具有位置字符串作为键。


你也可以做它作为一个短期,如果:回波

$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 />"; 
} 
+0

我起初尝试过,但后来它只是给第一个计数1 – rubyme8 2013-03-08 19:15:52

+0

@ ruby​​me8更新。这与你的解决方案有点不同,但即使数组一开始没有排序也可以工作。 – 2013-03-08 19:35:43

+0

非常感谢!这正如我所需要的那样工作!我将不得不研究你的答案一段时间,以更好地了解这是如何工作的。谢谢! – rubyme8 2013-03-08 19:52:22

0

这可能是因为i在你开始迭代,尝试把$i = 0;foreach开始后的那一刻不确定。

+0

刚刚尝试过,然后我得到了0的所有计数... – rubyme8 2013-03-08 18:54:39

+0

当然,这是一个愚蠢的建议。 var_dump($ models ['location'])''在'foreach'开始看到其中的内容后,可能是'$ locations'中的第一个$ models ['location']'不在'$ locations'中,因此它的打印值为0. – tonyjmnz 2013-03-08 18:58:36

+0

I只是用var_dump的输出更新了我的问题,有什么想法呢? – rubyme8 2013-03-08 19:04:38