Как удалить повторяющиеся значения из массива в PHP?






Используйте array_unique ().
Пример:
$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)
Вышеупомянутое сохранит ключи элементов. Если вы хотите, чтобы они переиндексировались, дополнительно примените array_values: php.net/manual/en/function.array-values.php
Это не сработало для меня, любезно используйте: $array = array_unique($array, SORT_REGULAR);
@PeterAjtai: Спасибо за выделение в разделе комментариев. Это сэкономило мне много времени.
Я сделал это без использования каких-либо функций.
$arr = array("1", "2", "3", "4", "5", "4", "2", "1");
$len = count($arr);
for ($i = 0; $i < $len; $i++) {
$temp = $arr[$i];
$j = $i;
for ($k = 0; $k < $len; $k++) {
if ($k != $j) {
if ($temp == $arr[$k]) {
echo $temp."<br>";
$arr[$k] = " ";
}
}
}
}
for ($i = 0; $i < $len; $i++) {
echo $arr[$i] . " <br><br>";
}
explode(",", implode(",", array_unique(explode(",", $YOUR_ARRAY))));
Это позаботится об ассоциациях ключей и сериализует ключи для полученного нового массива :-)
Каким будет эффект explode("," $YOUR_ARRAY), если $YOUR_ARRAY будет array("1", "2", "3")?
@kiamlaluno - :) и ответ: Предупреждение: explode () ожидает, что параметр 2 будет строкой, массив задан в ... в строке ....
@JesseChisholm Да, дело было в этом, но, по-видимому, никто не заметил кода.
иногда array_unique() не так,
если хочешь получить уникальные И повторяющиеся предметы ...
$unique=array("","A1","","A2","","A1","");
$duplicated=array();
foreach($unique as $k=>$v) {
if ( ($kt=array_search($v,$unique))!==false and $k!=$kt )
{ unset($unique[$kt]); $duplicated[]=$v; }
}
sort($unique); // optional
sort($duplicated); // optional
результаты на
array ( 0 => '', 1 => 'A1', 2 => 'A2', ) /* $unique */
array ( 0 => '', 1 => '', 2 => '', 3 => 'A1', ) /* $duplicated */
$arrDuplicate = array ("","",1,3,"",5);
foreach(array_unique($arrDuplicate) as $v){
if ($v != "" ){$arrRemoved = $v; }}
print_r($arrRemoved);
Это толком ничего не объясняет, да и "умнее" не кажется.
Вы всегда можете объяснить, почему, редактируя собственное сообщение, просто нажмите ссылку «изменить» в конце ответа. Я также предлагаю вам заглянуть в FAQ: stackoverflow.com/faq
//Find duplicates
$arr = array(
'unique',
'duplicate',
'distinct',
'justone',
'three3',
'duplicate',
'three3',
'three3',
'onlyone'
);
$unique = array_unique($arr);
$dupes = array_diff_key( $arr, $unique );
// array( 5=>'duplicate', 6=>'three3' 7=>'three3' )
// count duplicates
array_count_values($dupes); // array( 'duplicate'=>1, 'three3'=>2 )
Это отличный способ сделать это. Возможно, вы захотите убедиться, что его вывод снова является массивом. Теперь вы показываете только последнее уникальное значение.
Попробуй это:
$arrDuplicate = array ("","",1,3,"",5);
foreach (array_unique($arrDuplicate) as $v){
if ($v != "") { $arrRemoved[] = $v; }
}
print_r ($arrRemoved);
function arrayUnique($myArray)
{
$newArray = Array();
if (is_array($myArray))
{
foreach($myArray as $key=>$val)
{
if (is_array($val))
{
$val2 = arrayUnique($val);
}
else
{
$val2 = $val;
$newArray=array_unique($myArray);
$newArray=deleteEmpty($newArray);
break;
}
if (!empty($val2))
{
$newArray[$key] = $val2;
}
}
}
return ($newArray);
}
function deleteEmpty($myArray)
{
$retArray= Array();
foreach($myArray as $key=>$val)
{
if (($key<>"") && ($val<>""))
{
$retArray[$key] = $val;
}
}
return $retArray;
}
попробуйте этот короткий и приятный код -
$array = array (1,4,2,1,7,4,9,7,5,9);
$unique = array();
foreach($array as $v){
isset($k[$v]) || ($k[$v]=1) && $unique[] = $v;
}
var_dump($unique);
Выход -
array(6) {
[0]=>
int(1)
[1]=>
int(4)
[2]=>
int(2)
[3]=>
int(7)
[4]=>
int(9)
[5]=>
int(5)
}
Злоупотребление логическими операторами для потока управления напрасно сбивает с толку. Просто используйте if.
Это можно сделать с помощью функции, которую я сделал тремя дублирующими функциями, которые возвращают значения, которые дублируются в массиве.
Вторая функция single возвращает только те значения, которые являются единичными средними и не повторяются в массиве, а третья и полная функция возвращают все значения, но не дублируются, если какое-либо значение дублируется, она преобразует его в одиночное;
function duplicate($arr) {
$duplicate;
$count = array_count_values($arr);
foreach($arr as $key => $value) {
if ($count[$value] > 1) {
$duplicate[$value] = $value;
}
}
return $duplicate;
}
function single($arr) {
$single;
$count = array_count_values($arr);
foreach($arr as $key => $value) {
if ($count[$value] == 1) {
$single[$value] = $value;
}
}
return $single;
}
function full($arr, $arry) {
$full = $arr + $arry;
sort($full);
return $full;
}
В зависимости от размера вашего массива я нашел
$array = array_values( array_flip( array_flip( $array ) ) );
может быть быстрее, чем array_unique.
Дополнительная информация о том, что здесь происходит, и будет ли это быстрее с большим или меньшим массивом.
Двойной переворот удалит повторяющиеся значения, потому что ключ не может существовать дважды, иначе он будет перезаписан. Если какое-либо значение дублируется и массив переворачивается, последнее вхождение (я предполагаю) будет значением для ключа.
В PHP 7 я заметил, что многократное переворачивание многомерного массива может неожиданно изменить порядок элементов массива.
Единственное, что у меня сработало, это:
$array = array_unique($array, SORT_REGULAR);
Обновлено: SORT_REGULAR сохраняет тот же порядок исходного массива.
<?php
$arr1 = [1,1,2,3,4,5,6,3,1,3,5,3,20];
print_r(arr_unique($arr1));
function arr_unique($arr) {
sort($arr);
$curr = $arr[0];
$uni_arr[] = $arr[0];
for($i=0; $i<count($arr);$i++){
if ($curr != $arr[$i]) {
$uni_arr[] = $arr[$i];
$curr = $arr[$i];
}
}
return $uni_arr;
}
Ввод count ($ arr) в цикл довольно медленно
Используйте array_values(array_unique($array));
array_unique: для уникального массива
array_values: для переиндексации
+1 array_unique возвращает объект с парами ключ и значение, а array_values возвращает только значения в виде массива.
if (@!in_array($classified->category,$arr)){
$arr[] = $classified->category;
?>
<?php } endwhile; wp_reset_query(); ?>
первый раз проверьте значение в массиве и обнаружите такое же значение, игнорируйте его
Мы можем создать такой тип массива, чтобы использовать это последнее значение, которое будет обновлено до значения столбца или ключа, и мы получим уникальное значение из массива ...
$array = array (1,3,4,2,1,7,4,9,7,5,9);
$data=array();
foreach($array as $value ){
$data[$value]= $value;
}
array_keys($data);
OR
array_values($data);
Удалите повторяющиеся значения из ассоциативного массива в PHP.
$arrDup = Array ('0' => 'aaa-aaa' , 'SKU' => 'aaa-aaa' , '1' => '12/1/1' , 'date' => '12/1/1' , '2' => '1.15' , 'cost' => '1.15' );
foreach($arrDup as $k => $v){
if (!( isset ($hold[$v])))
$hold[$v]=1;
else
unset($arrDup[$k]);
}
Массив ([0] => aaa-aaa [1] => 12/1/1 [2] => 1,15)
$result = array();
foreach ($array as $key => $value){
if (!in_array($value, $result))
$result[$key]=$value;
}
Для этого может быть несколько способов, а именно:
//first method
$filter = array_map("unserialize", array_unique(array_map("serialize", $arr)));
//second method
$array = array_unique($arr, SORT_REGULAR);
Если вас интересует производительность и у вас простой массив, используйте:
array_keys(array_flip($array));
Это во много раз быстрее, чем array_unique.
Здесь я создал второй пустой массив и использовал цикл for с первым массивом, у которого есть дубликаты. Он будет выполняться столько раз, сколько счетчик первого массива. Затем сравнивается с положением массива с первым массивом и проверяется, есть ли этот элемент уже или нет, с помощью in_array. Если нет, то он добавит этот элемент во второй массив с array_push.
$a = array(1,2,3,1,3,4,5);
$count = count($a);
$b = [];
for($i=0; $i<$count; $i++){
if (!in_array($a[$i], $b)){
array_push($b, $a[$i]);
}
}
print_r ($b);
Не могли бы вы рассказать об этом коде? Например, почему бы вам не использовать петлю foreach?
Это своего рода форма работы, и почему я не использовал foreach, потому что мне очень удобен цикл for. Вот и все.
Тем не менее, вы должны поделиться некоторыми пояснениями с кодом. Публикация таких ответов на SO - нехороший стиль: могут прийти люди с той же проблемой, что и OP, и они должны быть в состоянии понять, как ваш код решает проблему, чтобы они могли извлечь из него уроки и адаптировать его к своим потребностям.
$a = array(1, 2, 3, 4);
$b = array(1, 6, 5, 2, 9);
$c = array_merge($a, $b);
$unique = array_keys(array_flip($c));
print_r($unique);
Самый быстрый способ добиться этого - использовать функцию array_flip, встроенную в PHP [1]. array_flip заменит значения массива их ключами, и, поскольку массив не может иметь повторяющихся ключей, вы получите уникальный набор ключей, который соответствует значениям исходного массива. Чтобы получить эти ключи как значения, вы можете использовать функцию array_keys для получения ваших уникальных значений. И array_flip, и array_keys являются функциями O (n) для наихудшего случая, в то время как array_unique имеет наихудший случай O (n log (n)). [2]
Пожалуйста, добавьте дополнительные пояснения к своему ответу (не в раздел комментариев!). Как данный код удаляет повторяющиеся значения из массива не замужем? Зачем для этого нужны два массива?
Добро пожаловать в StackOverflow! Я вижу, что вы добавили некоторые пояснения в комментарии к своему ответу, было бы полезно, если бы вы добавили эту информацию как часть самого ответа.
Кажется более разумным добавить этот комментарий в качестве редактирования к уже давно существующему ответу (stackoverflow.com/a/52591730/2109067).
Вы можете использовать один массив с повторяющимися элементами. У меня возникла проблема с получением значений из двух массивов в один, а затем с удалением дубликатов.
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");
// Deleting the duplicate items
$result = array_unique($array);
print_r($result);
ссылка: Демо
Какой смысл отвечать на этот вопрос с помощью array_unique через 11 лет после первоначального ответа, который является именно таким?
Альтернатива функции array_unique () ..
Использование алгоритма грубой силы
//[1] This our array with duplicated items
$matches = ["jorge","melvin","chelsy","melvin","jorge","smith"];
//[2] Container for the new array without any duplicated items
$arr = [];
//[3] get the length of the duplicated array and set it to the var len to be use for for loop
$len = count($matches);
//[4] If matches array key($i) current loop Iteration is not available in //[4] the array $arr then push the current iteration key value of the matches[$i] //[4] to the array arr.
for($i=0;$i
if (array_search($matches[$i], $arr) === false){ array_push($arr,$matches[$i]); } } //print the array $arr. print_r($arr); //Result: Array ( [0] => jorge [1] => melvin [2] => chelsy [3] => smith )
<?php
$a=array("1"=>"302","2"=>"302","3"=>"276","4"=>"301","5"=>"302");
print_r(array_values(array_unique($a)));
?>//`output -> Array ( [0] => 302 [1] => 276 [2] => 301 )`
Функция array_unique - лишь одна из действительно полезных встроенных функций PHP для работы с массивами. Недавно я написал статью о них и об операторе распространения для изменения массивов PHP и управления ими:
https://wp-helpers.com/2021/02/27/php-arrays-functions-and-spread-operator-in-wp-context/
На использование array_unique ответили 12 лет назад.
@ Ян -
Note that array_unique() is not intended to work on multi dimensional arrays.