【问题标题】:Generate array of unique values in specific array column在特定数组列中生成唯一值数组
【发布时间】:2013-04-19 20:43:32
【问题描述】:

我从查询中得到了想要的结果,但现在我无法确定 了解如何将数据操作成可用的东西。

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

我需要输出看起来像这样(我不知道后面会有多少组件 月/年...可能是 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_name 并将其附加到 所需输出的第一行...我只想要唯一的。

另外,一个组件在给定月份可能没有任何视图(它甚至可能没有 那个月存在)所以我可能有从 2 月开始的组件和其他组件 直到稍后才添加但包含在计数中...即添加了消声器 三月。

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

我在想:

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函数吗?

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

【问题讨论】:

  • array_unique() 函数能帮你获取组件的唯一名称吗?
  • array_unique()... 试过了,因为月/年/计数值,太多节点是唯一的

标签: php arrays unique array-column


【解决方案1】:

这个有php函数吗?

没有。 array_unique() 是最接近的,但不处理维度数组。

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

不幸的是,PHP(当前)没有将 pluck 键放入数组的数组函数,因此您可以使用 array_unique()

因此,缺少一些微优化或使用数组函数进行重构,您所拥有的通常就是您必须做的。

但是,您确实有错字:

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

【讨论】:

  • 查看我对“pluck”功能最接近的答案。还没有弄清楚如何将选择的名称作为第二个参数传递,所以在这个例子中对它进行了硬编码 - 但它可以工作。
【解决方案2】:

我想知道您是否对array_map 感到幸运,它允许您使用特定键提取所有元素。示例

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

不确定在 iPhone 上输入的语法是否完全正确,也不知道是否更有效率。但值得一试吗?

【讨论】:

  • + 但是,我认为这等同于原始代码使用数组函数重构。简单的答案是 PHP 目前无法使用单个函数完成所要求的任务。
  • @jasonmccreary - 我不反对。不过,我认为array_map 的使用很酷。我怀疑没有明显的性能差异。
  • 对我来说,这是同一个问题...用相同的键提取所有元素,你就会得到所有元素。
【解决方案3】:

你应该可以做array_column,然后array unique,所以试试这个:

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

【讨论】:

  • 谁投了反对票,你能解释一下原因吗?我发现这对我来说效果很好,并且比恕我直言下面的其他答案要简单..
  • 请注意,array_column 是 PHP 5.5 中的新功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
相关资源
最近更新 更多