【问题标题】:Remove Duplicate Data from POST array从 POST 数组中删除重复数据
【发布时间】:2012-01-20 19:18:59
【问题描述】:

我一直在寻找这个问题的答案,但似乎没有一个能真正帮助我的具体情况。我正在尝试发布一个单词列表,然后删除来自表单的重复数据(单词)。

由于某种原因,我似乎无法让 array_unique 工作。 PHP 不断给我错误,说我的帖子数组是一个字符串。但是如果我尝试使用explode,它会说我正在使用一个数组。现在真的很迷茫,很沮丧。

我的代码很简单:

if(!empty($_POST['keywords']))
{
    $posted = $_POST['keywords'];

    $posted = array_unique($posted);

    echo $posted;
}

我不一定要寻找一个确切的答案,而是一些指导,以便我可以更好地理解我在这里做错了什么。

形式:

    <form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
    <p>
        <textarea name="keywords" rows="20" columns="120"></textarea>
    </p>

    <p>
        <input type="submit" name="submit" />
    </p>
</form>

【问题讨论】:

    标签: php arrays duplicates


    【解决方案1】:

    考虑首先用空格分割关键字参数,然后找到唯一值:

    $posted = array_unique(explode(' ', str_replace("\n", ' ', $posted)));
    

    【讨论】:

    • ...另外,当回显结果时,变量 $posted 是一个数组,因此要查看它的值,可以使用 'echo print_r($posted, true)' (或者可能只是 'print_r ($posted)'
    • 嘿,Nathan,我试过了,我得到以下结果:Array ( [0] => test test ) ... 就像它仍然把它称为字符串一样。
    • 我想 textarea 值包含一个新行——试试这个版本,它首先将换行符转换为空格。
    • 很好,谢谢!我也添加了回报。换行符确实做出了改变,但它仍然没有取出副本。现在它的工作方式为:code $posted = array_unique(explode(' ', str_replace("\r\n", ' ', $posted)));
    【解决方案2】:

    之前的答案很好,但是由于单词是输入到文本字段中的,因此分隔符将是不可预测的。考虑改用正则表达式:

    preg_match_all('/([^\s]+)/', $_POST['keywords'], $matches);
    $unique_words = array_unique($matches[0]);
    

    【讨论】:

    • Ayman,我刚试过这个,它也有效。感谢您的想法!
    • 我刚刚意识到这有问题。由于它正在删除空格,因此它还将任何带有空格的单词(即 ayman safadi)转换为多个单词。
    • 同样会发生:explode(' ', $_POST['keywords']) 您可以指示用户使用逗号或换行符。或者想出一些花哨的前端解决方案来确保用户正确输入单词。
    • 是的,我现在可以看到了。两者都适用于没有空格的单个单词,但可以将带空格的单词变成单独的单词。
    • @714sooner - 只是想确保您阅读了我编辑的评论。
    【解决方案3】:

    您的关键字表单字段设置为文本区域,因此当您发布时,您发布的是一个字符串。试试这个:

    $posted = $_POST['keywords'];
    
    $postedKeywords = explode(' ', $posted);
    
    $posted = array_unique($postedKeywords);
    

    【讨论】:

    • 所以我尝试了这个并使用了 print_r。我尝试了 test 2x,结果如下:Array ([0] => test test)
    • @714sooner:可能有很多非空格字符。试试 Ayman 的解决方案,因为正则表达式会更健壮。
    • 谢谢,它看起来像是非空格字符。我很感激! :)
    【解决方案4】:

    也许你应该考虑使用 array_filter

    这样您就可以定义自己的回调函数,以最大限度地严格您的移除操作...

    http://php.net/manual/en/function.array-filter.php

    另外:您是否尝试过使用 array_unique 标志?

    http://php.net/manual/en/function.array-unique.php

    【讨论】:

    • 我没有尝试任何标志,因为我只是在慢慢构建它。在这一点上,我似乎根本无法删除任何重复项。我会研究旗帜。谢谢!
    猜你喜欢
    • 2020-02-11
    • 2016-09-04
    • 2022-01-19
    • 2019-10-19
    • 2011-06-29
    • 2020-11-06
    • 2011-01-04
    相关资源
    最近更新 更多