【问题标题】:PHP - Delete all duplicates in arrayPHP - 删除数组中的所有重复项
【发布时间】:2017-10-24 12:03:54
【问题描述】:

如何从多个数组中删除重复项?

pinkycocos 在我的数组中是双倍的。必须删除所有重复的单词。如果这些被删除,我会将这些词放在我的选择中。 我从我的数据库中得到这些词。

查询:

$queryClient = " SELECT DISTINCT `clients` FROM `reps` WHERE `clients` != ''";

这是我的代码:

while($row =  mysql_fetch_assoc($resultClient)){
    $names = explode(",", $row['clients']);
    echo '<pre>'; print_r($names); echo '</pre>';
}

结果:(那些食物词只是一个例子)

Array
    (
        [0] => chocolate
    )
    Array
    (
        [0] => vanilla
        [0] => cocos
    )
    Array
    (
        [0] => strawberry
    )
    Array
    (
        [0] => pinky
        [1] => watermelon
        [2] => melon
        [3] => cocos
    )
    Array
    (
        [0] => pinky 
    )
    Array
    (
        [0] => dark-chocolate
    )

我在我的 while 循环中尝试过,但没有成功:

$array = array_unique($names, SORT_REGULAR);

如何删除所有重复项?你能帮我吗?或者你有解决我问题的办法吗?帮助。

【问题讨论】:

  • 想要的结果是什么?
  • 我想要一个选择器。该选择器的选项是我的数据库中的食物那些不会是双重的
  • 抱歉,我已经删除了我的评论;)
  • 那么你还需要把数组展平吗?
  • 附言。这可能会很多用 SQL 查询更容易和更清晰地解决,所以如果你发布,我们可以给你一些指示;)查看GROUP BY 和函数group_concat(DISTINCT field_name) 和类似的:)

标签: php arrays array-unique


【解决方案1】:

这是一个单行:

print_r(array_unique(call_user_func_array('array_merge', $names)));

先将所有子数组合并为一个,然后得到唯一值。

完整示例:

$names = array();
while($row =  mysql_fetch_assoc($resultClient)){
    $names[] = explode(",", $row['clients']);
}
print_r(array_unique(call_user_func_array('array_merge', $names)));

【讨论】:

  • 先生,这不起作用!请帮我! while($row = mysql_fetch_assoc($resultClient)){ $names = explode(",", $row['clients']);回声'
    '。 print_r(array_unique(call_user_func_array('array_merge', $names))).'
    '; } @u_mulder
  • 我了解你,这很有效!但是......所有这些都需要在我的选择标签中in。我试过这个但没有用: '.$names.''; }
  • 了解你在你的代码中做了什么吗?为什么将print_r 的结果分配给$cucul?你知道print_r 返回什么吗?
【解决方案2】:

你可以做一个小技巧:

展平,计数,然后删除除最后一个以外的所有内容。

$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); 
$flatArray = [];
foreach($it as $v) {
   $flatArray[] = $v;           //Flatten array
}

//Note you can do array_unique on the flat array if you also need to flatten the array

$counts = array_count_values($flatArray); //Count 

foreach ($array as &$subarray) {
     foreach ($subarray as $index => $element) {
          $counts[$element]--;
          if ($counts[$element] > 0) { //If there's more than 1 left remove it
               unset($subarray[$index]);
          }
     }
} 

这将删除完全嵌套在第二层的重复项,而不会展平原始数组。

http://sandbox.onlinephpfunctions.com/code/346fd868bc89f484dac48d12575d678f3cb53626

【讨论】:

    【解决方案3】:

    首先您需要加入您的数组,然后才能过滤掉重复项:

    <?php
    $allNames = [];
    while($row =  mysql_fetch_assoc($resultClient)){
        $names = explode(",", $row['food']);
        $allNames[] = $names;
    }
    
    $allNames = array_merge(...$allNames);  //Join everything to a one dimensional array
    $allNames = array_unique($allNames); // Only keep unique elementes
    
    print_r($allNames);
    

    【讨论】:

    • 我试过你的sn-p,我只得到一个食物词?是不是很奇怪?
    • 这个sn-p怎么样? 好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅是为了 OP,也是为了 SO 的未来访问者。跨度>
    猜你喜欢
    • 2011-04-11
    • 2020-12-28
    • 2019-11-04
    • 2011-02-21
    • 1970-01-01
    • 2020-03-20
    • 2021-07-24
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多