2013-04-25 48 views
0

我从我的查询中获得了期望的结果,现在我无法在 中找出如何将数据操作为可用的数据。PHP在特定数组列中有多少个唯一值

最终目标是谷歌图表使用的json输出,我可以在 任何一个单一的组件没有问题。

我需要的输出看起来像这样(我不知道有多少分量怎么会后 月/年......它可能是0或10或20 ...):

 ['Month/Year', 'Wiper Blades', 'Mufflers'] [,[...]], 
     ['March 2013', 13,  11], 
     ['April 2013', 17,  19], 
     [...], 
     [...] 
     ]); 

这是我查询后的数组(因为我需要 cmpnt_name作为所需输出的第一行(上面),所以我要先构建数组):

Array 
(
    [0] => Array 
     (
      [vmonth] => February 
      [vyear] => 2013 
      [cmpnt_count] => 9 
      [cmpnt_name] => Wiper blade 
    ) 

    [1] => Array 
     (
      [vmonth] => March 
      [vyear] => 2013 
      [cmpnt_count] => 13 
      [cmpnt_name] => Wiper blade 
    ) 

    [2] => Array 
     (
      [vmonth] => March 
      [vyear] => 2013 
      [cmpnt_count] => 11 
      [cmpnt_name] => Muffler 
    ) 

    [3] => Array 
     (
      [vmonth] => April 
      [vyear] => 2013 
      [cmpnt_count] => 17 
      [cmpnt_name] => Wiper blade 
    ) 

    [4] => Array 
     (
      [vmonth] => April 
      [vyear] => 2013 
      [cmpnt_count] => 19 
      [cmpnt_name] => Muffler 
    ) 
) 

我无法循环访问数组,并将每个cmpnt_na我并追加到 所需输出的第一行...我只想独特。

另外一个组件可能不具有特定月份的任何意见(它可能没有甚至 当月存在的),所以我可能从二月最新组件,并且不被添加,直到后来,但其他部件 包括在计数中...即3月份添加了消声器 。

那么我该如何去查找第一行的唯一组件名称?

我在想:

function findUniques($cmpnt) 
{ 
    $names = array(); 
    foreach($cmpnt as $item) 
    { 
    $key = $item['cmpnt_name']; 
    if(array_key_exists($key, $names)) 
    { 
     $names[$key]++; 
    } 
    else 
     $names[$key] = 1; 
    } 
    return($names); 
} 

是否有这样的PHP函数?

有没有更好的方法来做到这一点?

+0

将在array_unique()函数帮助你获得部件的唯一名称? – Floris 2013-04-25 19:54:51

+0

array_unique()...试过了,太多的节点是唯一的,因为月/年/计数值 – ppetree 2013-04-25 20:08:56

回答

0

是否有PHP的这个功能?

编号array_unique()是最接近的,但不处理二维数组。

有没有更好的方法来做到这一点?

不幸的是,PHP(目前)不具有摘去键到一个数组,所以你可以再使用array_unique()阵列功能。因此,缺少一些微观优化或使用数组函数进行重构,您所拥有的通常就是您必须要做的。

但是,你必须错字:

$names[$key] = ++$count; 
+0

看到我的答案,我可以找出最接近的东西“pluck”函数。还没有弄清楚如何将elect的名字作为第二个参数传递,所以对这个例子进行了硬编码 - 但它起作用。 – Floris 2013-04-26 10:19:23

1

我知道你是否有一些运气array_map它允许你提取与特定键的所有元素。示例

Function compKey($v) { 
    Return $v['cmpnt_name']; 
} 
CKeys = array_map("compKey", $cmpnt); 
UniqueComponents = array_unique(CKeys); 

不确定的语法与在iPhone上键入此内容完全相同,并且不知道是否更高效。但值得一试?

+0

+但是,我认为这相当于使用数组函数*重构的原始代码*。简单的答案是PHP目前无法完成单个功能所要求的功能。 – 2013-04-26 12:11:57

+0

@jasonmccreary - 我不反对。虽然我认为这是'array_map'的一个很酷的用法。我怀疑没有可察觉的性能差异。 – Floris 2013-04-26 12:27:36

+0

对我来说,这是同样的问题...用相同的关键字提取所有元素,并获得所有元素。 – ppetree 2013-04-26 14:34:37

1

你应该能够做到array_column,然后阵列独一无二的,所以试试这个:

array_unique(array_column($cmpnt, 'cmpnt_name')); 
+0

谁downvoted,你能解释为什么吗?我发现这对我来说工作得很好,并且比IMHO下的其他答案更简单.. – progwhiz 2014-12-22 10:52:58

+0

请注意'array_column'是PHP 5.5中的新增功能。 – Shai 2015-10-06 14:44:53

相关问题