【问题标题】:I can not remove duplicates in array我无法删除数组中的重复项
【发布时间】:2012-05-21 07:47:42
【问题描述】:

我有这个: 有产品的表格,每个产品有超过 1 种颜色,例如:

  1. 玻璃有红、绿两种颜色
  2. 球有红色、绿色、黄色

我只想获得一次颜色,但是使用下面的代码,我会收到每种产品的不同数组。array_merge 不会将所有数组合并到一个数组中。请帮助我:

  1. 将数组合并为一个
  2. 删除新数组中的重复颜色。
$query='SELECT GROUP_CONCAT(DISTINCT colors SEPARATOR ", ") FROM products WHERE colors!="" GROUP BY colors';

$result=mysql_query($query) or die('Mysql Error:'.mysql_error().'<br /> Query:'.$query);
$num_rows=mysql_num_rows($result);

if($num_rows){
  while ($row = mysql_fetch_array($result, MYSQL_NUM)) {

  $array = array($row[0]);

  $colors = array_merge($array);

  var_dump($colors ); 

}

【问题讨论】:

  • 哪种语言?添加适当的标签。

标签: php arrays merge


【解决方案1】:

您是否只想要一系列颜色而不考虑产品?试试这个:

SELECT DISTINCT colors FROM products WHERE colors != ''

我在这里猜测,但我认为您的颜色列只是一个以逗号分隔的颜色列表。这并不是做这种事情的最好方法,但无论如何......尝试上面的查询,然后在 php 中

$result=mysql_query($query) or die('Mysql Error:'.mysql_error().'<br /> Query:'.$query);
$num_rows=mysql_num_rows($result);

if($num_rows){
$colors = array();
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {

    $array = explode(',' $row[0]);  // your row is just a string, explode it to get an array
    $colors = array_merge($colors, $array); // merge that into the colors array
}

$colors = array_map('trim', $colors); // in case there was any whitespace in your color strings
$colors = array_filter($colors); // remove any empties
$colors = array_unique($colors); // strip out the dupes

【讨论】:

  • 这样我会收到重复的颜色,这不是我想要的。我只希望所有产品的每种不同颜色一次,这样我就可以为访问者提供按颜色主题选择产品的选项..
  • 你不会得到重复的颜色。 DISTINCT 确保您只获得每一个。
  • 是的,但是对于一行,而不是对于所有结果。 DISTINCT 从产品中删除重复项,例如:GLASS - red, green, red - 红色将被删除,但如果下一个产品有红色,它将再次显示为红色.. 因为它们来自不同的数组..
  • 您的查询是针对整个表的,不考虑产品。这就是为什么我要问,您是要获取表格中所有颜色的数组还是特定产品的所有颜色列表,或者特定颜色的所有产品列表?如果您只想要每种颜色一次,此查询将得到它。
  • 查询的是全表产品。我想从餐桌产品中提取所有颜色,而不是过滤所有颜色,最后只向访问者显示每种颜色一次。我希望现在我更清楚:)
【解决方案2】:

不要 CONCAT 颜色,而是重写 SQL 以使每种颜色都有一行。将它们全部添加到一个数组中,然后运行array_filter()

【讨论】:

  • 我删除了 GROUP_CONCAT,但还是一样,即使在 array_filter() 之后,结果也会出现在不同的数组中。如何合并它们?
【解决方案3】:
$query='SELECT DISTINCT colors FROM products WHERE colors !=""';
$result=mysql_query($query) or die('Mysql Error:'.mysql_error().'<br /> Query:'.$query);
$colors = array();
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    $colors[] = $row[0]; 
}
var_dump($colors); 

【讨论】:

    【解决方案4】:

    如果我正确理解了您的问题,这意味着您想要由所有项目中的所有颜色组成的单个数组并且该数组必须是唯一的,您应该执行以下操作:您应该在 while 循环之外声明 $colors,并且然后将array_merge 替换为检查提供的颜色是否在$colors 数组中的函数,如果不是则添加到它。代码如下:

    $query='SELECT GROUP_CONCAT(DISTINCT colors SEPARATOR ", ") FROM products WHERE colors!="" GROUP BY colors';
    
    $result=mysql_query($query) or die('Mysql Error:'.mysql_error().'<br /> Query:'.$query);
    $num_rows=mysql_num_rows($result);
    $colors=array();
    if($num_rows){
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    
    $array = array($row[0]);
    
    $colors = array_merge($array);
    
    
    }
    $colors=array_unique($input);
    var_dump($colors);
    

    【讨论】:

    • 完全正确 :) 你能告诉我怎么做吗.. 我的意思是脚本 :)
    • 所有结果都丢失或只有一些特定的?您使用的是 PHP 5?
    • 尝试使用array_unique函数删除行并告诉我所有颜色是否都在数组中,包括重复
    • 您能否提供简单的示例,因为我在本地 PC 上尝试过,它可以工作。
    • 这是结果的样子 array(1) { [0]=> string(35) "red, green, Purple, blue" } 我缺少黄色和黑色
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 2014-04-23
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多