Проверить наличие повторяющихся элементов в массиве PHP (если он не пустой)

Привет, допустим, у меня есть этот массив:

$check_post = array(

 $_POST["a_post"],
 $_POST["b_post"],
 $_POST["c_post"],
 $_POST["d_post"],
 $_POST["e_post"],
 $_POST["f_post"],
 $_POST["g_post"],
 $_POST["h_post"],
 $_POST["i_post"]

 );

Я хочу проверить, повторяются ли какие-либо элементы этого массива, поэтому лучшее, что у меня есть, это:

if (count(array_unique($check_post)) < count($check_post))  
    echo "Duplicate";  
else  
    echo "NO Duplicate";

Что отлично работает, за исключением того факта, что если больше одного текстового поля остается пустым (что разрешено), это дает мне ЛОЖЬ.

Я хочу НЕ рассматривать пустые значения массива для (count(array_unique())

Кстати, я пробовал с empty() и с array_values($check_post), но не могу обойти это.

Заранее спасибо!! пожалуйста, обратитесь за любыми необходимыми разъяснениями.


person Trufa    schedule 18.11.2010    source источник


Ответы (3)


Чтобы удалить все пустые значения из сравнения, вы можете добавить array_diff():

if (count(array_unique(array_diff($check_post,array("")))) < count(array_diff($check_post,array(""))))  
person AndreKR    schedule 18.11.2010
comment
я думаю, что ОП хочет, чтобы пустые тарелки вносили свой вклад в левое количество, но не в правое - person jon_darkstar; 18.11.2010
comment
Тогда он всегда будет получать Duplicate, когда есть пустые значения. Не думаю, что он этого хотел. - person AndreKR; 18.11.2010
comment
@jon Я думаю, что OP хочет, чтобы пустые ключи полностью игнорировались - person meagar; 18.11.2010
comment
Это простое и гениальное решение, это именно то, что я хотел. Большое спасибо!! - person Trufa; 18.11.2010
comment
о, это имеет больше смысла. Я прочитал это. Я хочу НЕ рассматривать пустые значения массива для (count(array_unique())) и воспринимать его буквально - person jon_darkstar; 18.11.2010
comment
Спасибо, это работает. +1 - person Prasad Patel; 16.04.2021

Хорошо, как у вас есть, хотя, как вы говорите, вам нужно сначала удалить пустые записи.

$non_empty_check_post = array_filter($check_post, create_function('$item', 'return !empty($item);');

if (count(array_unique($non_empty_check_post)) < count($non_empty_check_post)) {
    echo "Duplicate";
} else {
    echo "NO Duplicate";
}
person Orbling    schedule 18.11.2010
comment
+1. Но нет необходимости предоставлять функцию обратного вызова для array_filter, когда вы хотите удалить пробелы (или записи, которые оцениваются как false). Руководство говорит, что если обратный вызов не предоставлен, все записи ввода, равные FALSE, будут удалены. :) - person netcoder; 18.11.2010
comment
@netcoder Совершенно верно! array_filter($check_post) будет достаточно. - person Orbling; 18.11.2010

Отфильтруйте пробелы из вашего массива:

function no_blanks($val) {
    // Do not use empty() here if you don't consider the string "0" as blank
    return trim($val) !== '';
}

$check_post = array_filter($check_post, 'no_blanks');

if (count(array_unique($check_post)) < count($check_post))  
    echo "Duplicate";  
else  
    echo "NO Duplicate";
person BoltClock    schedule 18.11.2010
comment
+1. Но нет необходимости предоставлять функцию обратного вызова для array_filter, когда вы хотите удалить пробелы (или записи, которые оцениваются как false). Руководство говорит, что если обратный вызов не предоставлен, все записи ввода, равные FALSE, будут удалены. :) - person netcoder; 18.11.2010
comment
@netcoder: мой обратный вызов строго проверяет только пустую строку, потому что строки, содержащие цифру ноль, также будут очищены array_filter(), что может идти вразрез с намерениями OP. Я использовал array_filter() в другом ответе, который я опубликовал ранее :) - person BoltClock; 18.11.2010
comment
А, я вижу, что ты здесь сделал. Имеет смысл! - person netcoder; 18.11.2010