Array unique не работает

Array unique не работает

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.

Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо

После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..

Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.

Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.

Читайте также:  Почему не работает личный кабинет квартплата инфо

На последок как оно происходит на форумах

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.

Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

Источник

Почему перестал работать array_unique?

задавал вопросик Какую функцию array diff применить?
на сайте все работало как часики , но вот спустя время (ВООБЩЕ НЕЧЕГО НЕ МЕНЯЛОСЬ В КОДЕ И В БД) и тут тебе на.

$result выдает кучу кучную дублей
через var_dump я проверил оба массива , они такие же по структуре , ошибок соответственно нет , как понять почему идут дубли? Код ведь работал.

  • Вопрос задан 07 июн.
  • 129 просмотров

Spartak (Web-StyleStudio), код с момента прошлого вопроса не изменился , по факту вот он Какую функцию array diff применить?

я уже подумал и об версии php и о данных в БД , уже не знаю что думать
остался только вариант полностью выгрузить данные из БД и проверить построчно, желательно это сделать где то в песочнице, но я не знаю как тот же var_dump сделать в виде массива готового для скармливания в php

код с момента прошлого вопроса не изменился , по факту вот он Какую функцию array diff применить?

методом проб и ошибок я понял что не работает именно array_filter так как в $ids переменной все выводит без дублей , код ведь работал((

Павел,
И где в этом коде $array2 и $array1 ?
Только не нужно копировать с прошлого вопроса, нужен конкретно ваш код!

И для начала включите отображение ошибок на экран

А вся проблема в том, что ты не понимаешь, что делает «твой» код.
И следовательно, не можешь его отлаживать.

Это к вопросу о том, как легко и приятно быть программистом, когда код за тебя пишут другие.
Ну вот оно тебе и прилетело в обраточку, это «приятно»

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

Поэтому тебе надо сейчас либо собраться и решить задачу самостоятельно, продумав алгоритм и реализовав его простыми средствами — циклами и условными переходами. Без всяких красивых слов типа array_diff, array_filter и прочих. Потому что использовать синтаксический сахар можно только тогда, когда ты понимаешь, как он работает внутри. Если не понимаешь — то код надо писать руками, а не волшебными функциями.
И после этого, понимая как работает твой код, ты сможешь заняться отладкой, запуская его, и выводя промежуточные результаты.
Либо, если не выйдет, то продать компьютер и идти работать в макдональдс.

А вот это вот как у тебя сейчас — «ой мне один добрый дядя написал кодик, но он ниработаит, давайте другой добрый дядя мне его починит» — это не будет работать. Два раза тебе помогут, но постоянно жить чужим трудом не получится. А «программист», который не умеет писать код сложнее уровня «вайл муэскуэль фетч эррей» никому не нужен.

что такое array_filter? Это реализация примитивного цикла,

что такое array_diff? Это реализация чуть более сложного алгоритма, когда мы перебираем первый массив, и смотрим, есть ли такой же элемент во втором. Если нет — то записываем это значение в третий.
И так далее.

Источник

array_unique() не работает

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Array_unique как то не так работает ?
Элементам массива присвоены значения: $arr=$point->town; $arr=$point->settlement;.

функция array_unique
Доброго времени суток уважаемые форумчане. Появилась надобность удалить дубликаты из массива.

Как из array_unique получить count?
Есть такой код: $masters = array(); while($ob = $res->GetNextElement())< $arProps =.

Как без array_unique удалить из одного массива все значения, которые совпадают с значениями второго массива
Всем привет, не подскажете как без array_unique удалить из одного массива все значения, которые.

Добавлено через 48 секунд
потому что значения нового массива всего два

либо проверять ключ на существование, либо использовать foreach

Добавлено через 1 минуту
либо использовать sort()

Приложение работает в Debug, странно работает в Release и не работает при билде
Действия выполняются на эмуляторе Pixel 2. Android 9.0. Если я запускаю приложение с конфигурацией.

Мышь работает через раз, то есть запустил ОС — мышь не работает, перезагрузил — мышь работает
Установлена Windows 7 со всеми последними обновлениями. Все всегда замечательно работало. Но с.

Надо понять правильно работает код или нет. И работает ли он вообще
Он должен вычислить сумму с точностью эпсилон #include using namespace std; .

Не работает php на wps-е. Гланвая страница работает все остальное нет
На локальном дэнвере все отлично работает. Но при копировании на впс и сдоступом через сеть.

Не работает монитор комп работает а на мониторе нет изображения что делать ?
У меня компьютер старый давно покупал и мне захотелось проверить включается или нет и тут возникла.

При включении компа у меня не работает монитор, но нормально работает ТВ-выход
Уже несколько дней рву волосы на голове. Такая проблемка: при включении компа у меня не.

Источник

Почему перестал работать array_unique?

задавал вопросик Какую функцию array diff применить?
на сайте все работало как часики , но вот спустя время (ВООБЩЕ НЕЧЕГО НЕ МЕНЯЛОСЬ В КОДЕ И В БД) и тут тебе на.

$result выдает кучу кучную дублей
через var_dump я проверил оба массива , они такие же по структуре , ошибок соответственно нет , как понять почему идут дубли? Код ведь работал.

  • Вопрос задан 07 июн.
  • 129 просмотров

Spartak (Web-StyleStudio), код с момента прошлого вопроса не изменился , по факту вот он Какую функцию array diff применить?

я уже подумал и об версии php и о данных в БД , уже не знаю что думать
остался только вариант полностью выгрузить данные из БД и проверить построчно, желательно это сделать где то в песочнице, но я не знаю как тот же var_dump сделать в виде массива готового для скармливания в php

код с момента прошлого вопроса не изменился , по факту вот он Какую функцию array diff применить?

методом проб и ошибок я понял что не работает именно array_filter так как в $ids переменной все выводит без дублей , код ведь работал((

Павел,
И где в этом коде $array2 и $array1 ?
Только не нужно копировать с прошлого вопроса, нужен конкретно ваш код!

И для начала включите отображение ошибок на экран

А вся проблема в том, что ты не понимаешь, что делает «твой» код.
И следовательно, не можешь его отлаживать.

Это к вопросу о том, как легко и приятно быть программистом, когда код за тебя пишут другие.
Ну вот оно тебе и прилетело в обраточку, это «приятно»

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

Поэтому тебе надо сейчас либо собраться и решить задачу самостоятельно, продумав алгоритм и реализовав его простыми средствами — циклами и условными переходами. Без всяких красивых слов типа array_diff, array_filter и прочих. Потому что использовать синтаксический сахар можно только тогда, когда ты понимаешь, как он работает внутри. Если не понимаешь — то код надо писать руками, а не волшебными функциями.
И после этого, понимая как работает твой код, ты сможешь заняться отладкой, запуская его, и выводя промежуточные результаты.
Либо, если не выйдет, то продать компьютер и идти работать в макдональдс.

А вот это вот как у тебя сейчас — «ой мне один добрый дядя написал кодик, но он ниработаит, давайте другой добрый дядя мне его починит» — это не будет работать. Два раза тебе помогут, но постоянно жить чужим трудом не получится. А «программист», который не умеет писать код сложнее уровня «вайл муэскуэль фетч эррей» никому не нужен.

что такое array_filter? Это реализация примитивного цикла,

что такое array_diff? Это реализация чуть более сложного алгоритма, когда мы перебираем первый массив, и смотрим, есть ли такой же элемент во втором. Если нет — то записываем это значение в третий.
И так далее.

Источник

array_unique

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_unique — Убирает повторяющиеся значения из массива

Описание

Принимает входной массив array и возвращает новый массив без повторяющихся значений.

Обратите внимание, что ключи сохранятся. Если в соответствии с заданными flags несколько элементов определяются как идентичные, то будут сохранены ключ и значение первого такого элемента.

Замечание: Два элемента считаются одинаковыми в том и только в том случае, если (string) $elem1 === (string) $elem2 . Другими словами: если у них одинаковое строковое представление, то будет использован первый элемент.

Список параметров

Можно использовать необязательный второй параметр flags для изменения поведения сортировки с помощью следующих значений:

Виды сортировок флагов:

  • SORT_REGULAR — нормальное сравнение элементов (типы не меняются)
  • SORT_NUMERIC — элементы сравниваются как числа
  • SORT_STRING — элементы сравниваются как строки
  • SORT_LOCALE_STRING — сравнивает элементы как строки, с учётом текущей локали.

Возвращаемые значения

Возвращает отфильтрованный массив.

Список изменений

Версия Описание
7.2.0 Если flags равен SORT_STRING , ранее массив array копировался, а не уникальные элементы удалялись (сохраняя значения цифровых индексов), но теперь создаётся новый массив путём добавления уникальных элементов. Это может привести к различным числовым индексам.

Примеры

Пример #1 Пример использования array_unique()

Результат выполнения данного примера:

Пример #2 array_unique() и типы:

Результат выполнения данного примера:

Примечания

Замечание: Обратите внимание, что array_unique() не предназначена для работы с многомерными массивами.

Смотрите также

  • array_count_values() — Подсчитывает количество всех значений массива

User Contributed Notes 41 notes

Create multidimensional array unique for any single key index.
e.g I want to create multi dimentional unique array for specific code

Code :
My array is like this,

= array(
0 => array( «id» => «1» , «name» => «Mike» , «num» => «9876543210» ),
1 => array( «id» => «2» , «name» => «Carissa» , «num» => «08548596258» ),
2 => array( «id» => «1» , «name» => «Mathew» , «num» => «784581254» ),
);
?>

You can make it unique for any field like id, name or num.

I have develop this function for same :
function unique_multidim_array ( $array , $key ) <
$temp_array = array();
$i = 0 ;
$key_array = array();

foreach( $array as $val ) <
if (! in_array ( $val [ $key ], $key_array )) <
$key_array [ $i ] = $val [ $key ];
$temp_array [ $i ] = $val ;
>
$i ++;
>
return $temp_array ;
>
?>

Now, call this function anywhere from your code,

something like this,
= unique_multidim_array ( $details , ‘id’ );
?>

Output will be like this :
= array(
0 => array( «id» => «1» , «name» => «Mike» , «num» => «9876543210» ),
1 => array( «id» => «2» , «name» => «Carissa» , «num» => «08548596258» ),
);
?>

In reply to performance tests array_unique vs foreach.

In PHP7 there were significant changes to Packed and Immutable arrays resulting in the performance difference to drop considerably. Here is the same test on php7.1 here;
http://sandbox.onlinephpfunctions.com/code/2a9e986690ef8505490489581c1c0e70f20d26d1

$max = 770000; //large enough number within memory allocation
$arr = range(1,$max,3);
$arr2 = range(1,$max,2);
$arr = array_merge($arr,$arr2);

$time = -microtime(true);
$res1 = array_unique($arr);
$time += microtime(true);
echo «deduped to «.count($res1).» in «.$time;
// deduped to 513333 in 1.0876770019531

$time = -microtime(true);
$res2 = array();
foreach($arr as $key=>$val) <
$res2[$val] = true;
>
$res2 = array_keys($res2);
$time += microtime(true);
echo «
deduped to «.count($res2).» in «.$time;
// deduped to 513333 in 0.054931879043579

I find it odd that there is no version of this function which allows you to use a comparator callable in order to determine items equality (like array_udiff and array_uintersect). So, here’s my version for you:

function array_uunique (array $array , callable $comparator ): array <
$unique_array = [];
do <
$element = array_shift ( $array );
$unique_array [] = $element ;

$array = array_udiff (
$array ,
[ $element ],
$comparator
);
> while ( count ( $array ) > 0 );

return $unique_array ;
>
?>

And here is a test code:

public function __construct ( int $a ) <
$this -> a = $a ;
>
>

$array_of_objects = [new Foo ( 2 ), new Foo ( 1 ), new Foo ( 3 ), new Foo ( 2 ), new Foo ( 2 ), new Foo ( 1 )];

$comparator = function ( Foo $foo1 , Foo $foo2 ): int <
return $foo1 -> a $foo2 -> a ;
>;

var_dump ( array_uunique ( $array_of_objects , $comparator )); // should output [Foo(2), Foo(1), Foo(3)]
?>

It’s often faster to use a foreache and array_keys than array_unique:

= 1000000 ;
$arr = range ( 1 , $max , 3 );
$arr2 = range ( 1 , $max , 2 );
$arr = array_merge ( $arr , $arr2 );

$time = — microtime ( true );
$res1 = array_unique ( $arr );
$time += microtime ( true );
echo «deduped to » . count ( $res1 ). » in » . $time ;
// deduped to 666667 in 32.300781965256

$time = — microtime ( true );
$res2 = array();
foreach( $arr as $key => $val ) <
$res2 [ $val ] = true ;
>
$res2 = array_keys ( $res2 );
$time += microtime ( true );
echo «
deduped to » . count ( $res2 ). » in » . $time ;
// deduped to 666667 in 0.84372591972351

Taking the advantage of array_unique, here is a simple function to check if an array has duplicate values.

It simply compares the number of elements between the original array and the array_uniqued array.

function array_has_duplicates (array $array )
<
$uniq = array_unique ( $array );
return count ( $uniq ) != count ( $array );
>

For people looking at the flip flip method for getting unique values in a simple array. This is the absolute fastest method:

= array_keys ( array_flip ( $array ));
?>

It’s marginally faster as:
= array_merge ( array_flip ( array_flip ( $array )));
?>

And it’s marginally slower as:
( array_flip ( $array )); // leaves gaps
?>

It’s still about twice as fast or fast as array_unique.

This tested on several different machines with 100000 random arrays. All machines used a version of PHP5.

In case you are looking for a function that works like array_unique but does not do the string conversion first.

function array_unique_full ( $arr , $strict = false ) <
return array_filter ( $arr , function( $v , $k ) use ( $arr , $strict ) <
return array_search ( $v , $arr , $strict ) === $k ;
>, ARRAY_FILTER_USE_BOTH );
>
?>

As for PHP 7.1.12, this is the comparison between array_keys(array_flip()), array_flip(array_flip()), for each elimination and array_unique. The array_keys(array_flip()) is the fastest method to remove duplication values from a single dimension array:

= 1000000 ;
$arr = range ( 1 , $max , 3 );
$arr2 = range ( 1 , $max , 2 );
$arr = array_merge ( $arr , $arr2 );

$time = — microtime ( true );
$res1 = array_unique ( $arr );
$time += microtime ( true );

echo «
deduped to » . count ( $res1 ). » in » . $time ;
// deduped to 666667 in 0.78185796737671
// memory used: 33558528

$time = — microtime ( true );
$res2 = array_flip ( array_flip ( $arr ));
$time += microtime ( true );

deduped to » . count ( $res2 ). » in » . $time ;
// deduped to 666667 in 0.072191953659058
// memory used: 3774873

$time = — microtime ( true );
$res3 = array();
foreach( $arr as $key => $val ) <
$res3 [ $val ] = true ;
>
$res3 = array_keys ( $res3 );
$time += microtime ( true );

deduped to » . count ( $res3 ). » in » . $time ;
// deduped to 666667 in 0.095494985580444
// memory used: 33558528

$time = — microtime ( true );
$res4 = array_keys ( array_flip ( $arr ));
$time += microtime ( true );

deduped to » . count ( $res4 ). » in » . $time ;
// deduped to 666667 in 0.05807900428772
// memory used: 33558528

Simple and clean way to get duplicate entries removed from a multidimensional array.

= $multi_array [ 0 ];
$multi_array = array_unique ( $multi_array );
print_r ( $multi_array );
?>

I needed to identify email addresses in a data table that were replicated, so I wrote the array_not_unique() function:

function array_not_unique ( $raw_array ) <
$dupes = array();
natcasesort ( $raw_array );
reset ( $raw_array );

$old_key = NULL ;
$old_value = NULL ;
foreach ( $raw_array as $key => $value ) <
if ( $value === NULL ) < continue; >
if ( $old_value == $value ) <
$dupes [ $old_key ] = $old_value ;
$dupes [ $key ] = $value ;
>
$old_value = $value ;
$old_key = $key ;
>
return $dupes ;
>

$raw_array = array();
$raw_array [ 1 ] = ‘abc@xyz.com’ ;
$raw_array [ 2 ] = ‘def@xyz.com’ ;
$raw_array [ 3 ] = ‘ghi@xyz.com’ ;
$raw_array [ 4 ] = ‘abc@xyz.com’ ; // Duplicate

$common_stuff = array_not_unique ( $raw_array );
var_dump ( $common_stuff );
?>

Case insensitive; will keep first encountered value.

function array_iunique ( $array ) <
$lowered = array_map ( ‘strtolower’ , $array );
return array_intersect_key ( $array , array_unique ( $lowered ));
>

Another form to make an array unique (manual):

This is my array

Array
(
[0] => Array
(
[0] => 40665
[1] => 40665
[2] => 40665
[3] => 40665
[4] => 40666
[5] => 40666
[6] => 40666
[7] => 40666
[8] => 40667
[9] => 40667
[10] => 40667
[11] => 40667
[12] => 40667
[13] => 40668
[14] => 40668
[15] => 40668
[16] => 40668
[17] => 40668
[18] => 40669
[19] => 40669
[20] => 40670
[21] => 40670
[22] => 40670
[23] => 40670
[24] => 40671
[25] => 40671
[26] => 40671
[27] => 40671
[28] => 40671
)

[1] => Array
(
[0] => 40672
[1] => 40672
[2] => 40672
[3] => 40672
)

this is my script:

$anterior = 0;
foreach($item as $array_key => $array_value)
<
echo «

  • $array_key»;
    echo »
      «;
      foreach($array_value as $xarray_key => $xarray_value) <
      if($xarray_value != $anterior) <
      echo «
    • $xarray_key => $xarray_value»;
      $item_nuevo[$array_key][] = $xarray_value; // or to use the same key number $item_nuevo[$array_key][$xarray_key] = $xarray_value;
      >
      $anterior = $xarray_value;
      >
      echo «

    «;
    >

    0
    0 => 40665
    4 => 40666
    8 => 40667
    13 => 40668
    18 => 40669
    20 => 40670
    24 => 40671

    saludos desde chile.

    If you find the need to get a sorted array without it preserving the keys, use this code which has worked for me:

    = array( «hello» , «fine» , «good» , «fine» , «hello» , «bye» );

    $get_sorted_unique_array = array_values ( array_unique ( $array ));

    ?>

    The above code returns an array which is both unique and sorted from zero.

    recursive array unique for multiarrays

    function super_unique ( $array )
    <
    $result = array_map ( «unserialize» , array_unique ( array_map ( «serialize» , $array )));

    foreach ( $result as $key => $value )
    <
    if ( is_array ( $value ) )
    <
    $result [ $key ] = super_unique ( $value );
    >
    >

    [Editor’s note: please note that this will not work well with non-scalar values in the array. Array keys can not be arrays themselves, nor streams, resources, etc. Flipping the array causes a change in key-name]

    You can do a super fast version of array_unique directly in PHP, even faster than the other solution posted in the comments!

    Compared to the built in function it is 20x faster! (2x faster than the solution in the comments).

    function superfast_array_unique ( $array ) <
    return array_keys ( array_flip ( $array ));
    >
    ?>

    This works faster for small and big arrays.

    My object unique function:

    function object_unique ( $obj ) <
    $objArray = (array) $obj ;

    $objArray = array_intersect_assoc ( array_unique ( $objArray ), $objArray );

    foreach( $obj as $n => $f ) <
    if( ! array_key_exists ( $n , $objArray ) ) unset( $obj -> $n );
    >

    return $obj ;
    >
    ?>

    And these code:

    class Test <
    public $pr0 = ‘string’ ;
    public $pr1 = ‘string1’ ;
    public $pr2 = ‘string’ ;
    public $pr3 = ‘string2’ ;
    >

    var_dump ( object_unique ( $obj ) );
    ?>

    returns:
    object(Test)[1]
    public ‘pr0’ => string ‘string’ (length=6)
    public ‘pr1’ => string ‘string1’ (length=7)
    public ‘pr3’ => string ‘string2’ (length=7)

    This is a script for multi_dimensional arrays

    function remove_dup ( $matriz ) <
    $aux_ini =array();
    $entrega =array();
    for( $n = 0 ; $n count ( $matriz ); $n ++)
    <
    $aux_ini []= serialize ( $matriz [ $n ]);
    >
    $mat = array_unique ( $aux_ini );
    for( $n = 0 ; $n count ( $matriz ); $n ++)
    <

    $entrega []= unserialize ( $mat [ $n ]);

    so . my problem was multidimensional sort.

    = array();
    $exclude = array( «» );
    for ( $i = 0 ; $i count ( $attribs )- 1 ; $i ++) <
    if (! in_array ( trim ( $attribs [ $i ][ «price» ]) , $exclude )) < $new [] = $attribs [ $i ]; $exclude [] = trim ( $attribs [ $i ][ "price" ]); >
    >

    ?>

    Array $attribs is an array contaning arrays. Each array in the $attrib array consists in multiple fields (ex: name, lenght, price, etc.) to be more simpler in speech think that $attrib is the array resulted by a search sql query done by a visitator on your online shoopping website . (so . each array in the $attrib is a product :P) if you want to sort only the uniq results use the above or use this:

    /* Our Array of products */
    $attribs [] = array(
    «name» => «Test Product 1» ,
    «length» => «42 cm» ,
    «weight» => «0,5 kg» ,
    «price» => «10 $» ,
    «stock» => «100» ,
    );

    $attribs [] = array(
    «name» => «Test Product 2» ,
    «length» => «42 cm» ,
    «weight» => «1,5 kg» ,
    «price» => «10 $» ,
    «stock» => «200» ,
    );

    $new = array();
    $exclude = array( «» );
    for ( $i = 0 ; $i count ( $attribs )- 1 ; $i ++) <
    if (! in_array ( trim ( $attribs [ $i ][ «price» ]) , $exclude )) < $new [] = $attribs [ $i ]; $exclude [] = trim ( $attribs [ $i ][ "price" ]); >
    >

    print_r ( $new ); // $new is our sorted array

    ?>

    Have fun tweaking this ;)) i know you will ;))

    From Romania With Love

    another method to get unique values is :

    =array( ‘a’ , ‘b’ , ‘c’ , ‘a’ , ‘b’ , ‘d’ , ‘e’ , ‘f’ , ‘f’ );

    $alpha = array_keys ( array_count_values ( $alpha ));

    print_r ( $alpha );
    ?>

    Output:
    Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f )

    I found the simplest way to «unique» multidimensional arrays as follows:

    = array(
    ‘a’ => array( 1 , 2 ),
    ‘b’ => array( 1 , 2 ),
    ‘c’ => array( 2 , 2 ),
    ‘d’ => array( 2 , 1 ),
    ‘e’ => array( 1 , 1 ),
    );

    $array = array_map ( ‘json_encode’ , $array );
    $array = array_unique ( $array );
    $array = array_map ( ‘json_decode’ , $array );

    ?>

    As you can see «b» will be removed without any errors or notices.

    The following is an efficient, adaptable implementation of array_unique which always retains the first key having a given value:

    function array_unique2 (& $aray ) <
    $aHash = array();
    foreach ( $aray as $key => & $val ) if (@ $aHash [ $val ]++) unset ( $aray [ $key ]);
    >
    ?>

    It is also adaptable to multi dimensional arrays. For example, if your array is a sequence of (multidimensional) points, then in place of @$aHash[$val]++ you could use @$aHash[implode(«X»,$val)]++
    If you want to not have holes in your array, you can do an array_merge($aray) at the end.

    Another way to ‘unique column’ an array, in this case an array of objects:
    Keep the desired unique column values in a static array inside the callback function for array_filter.

    Example:
    /* example object */
    class myObj <
    public $id ;
    public $value ;
    function __construct ( $id , $value ) <
    $this -> id = $id ;
    $this -> value = $value ;
    >
    >

    /* callback function */
    function uniquecol ( $obj ) <
    static $idlist = array();

    if ( in_array ( $obj -> id , $idlist ) )
    return false ;

    $idlist [] = $obj -> id ;
    return true ;
    >

    /* a couple of arrays with second array having an element with same id as the first */
    $list = array( new myObj ( 1 , 1 ), new myObj ( 2 , 100 ) );
    $list2 = array( new myObj ( 1 , 10 ), new myObj ( 3 , 100 ) );
    $list3 = array_merge ( $list , $list2 );

    $unique = array_filter ( $list3 , ‘uniquecol’ );
    print_r ( $list3 );
    print_r ( $unique );

    ?>

    In addition, use array_merge( $unique ) to reindex.

    Here’s the shortest line of code I could find/create to remove all duplicate entries from an array and then reindex the keys.

    // Fruits, vegetables, and other food:
    $var = array( ‘apple’ , ‘banana’ , ‘carrot’ , ‘cat’ , ‘dog’ , ‘egg’ , ‘eggplant’ , ‘fish’ );

    $var = array_values ( array_unique ( $var ));
    ?>

    Lets say that you want to capture unique values from multidimensional arrays and flatten them in 0 depth.

    i.e.
    = array( ‘a’ => array( 1 , 2 , 3 , 4 ), ‘b’ => array( ‘c’ => array( 4 , 5 , 6 , 7 ) ) );
    ?>

    will return with array_flat( $tmp ) —> array( 1,2,3,4,5,6,7 );

    I hope that the function will help someone

    /**
    * @params : $a array the recursion array
    * : $s array storage array
    * : $l integer the depth level
    *
    */
    if( ! function_exists ( ‘array_flat’ ) )
    <
    function array_flat ( $a , $s = array( ), $l = 0 )
    <
    # check if this is an array
    if( ! is_array ( $a ) ) return $s ;

    # go through the array values
    foreach( $a as $k => $v )
    <
    # check if the contained values are arrays
    if( ! is_array ( $v ) )
    <
    # store the value
    $s [ ] = $v ;

    # move to the next node
    continue;

    # increment depth level
    $l ++;

    # replace the content of stored values
    $s = array_flat ( $v , $s , $l );

    # decrement depth level
    $l —;

    # get only unique values
    if( $l == 0 ) $s = array_values ( array_unique ( $s ) );

    # return stored values
    return $s ;

    > # end of function array_flat( .

    I searched how to show only the de-duplicate elements from array, but failed.
    Here is my solution:

    $result = arrayUniqueElements ( $arr1 );
    print_r ( $result );exit;
    ?>

    Output:

    Problem:
    I have loaded an array with the results of a database
    query. The Fields are ‘FirstName’ and ‘LastName’.

    I would like to find a way to contactenate the two
    fields, and then return only unique values for the
    array. For example, if the database query returns
    three instances of a record with the FirstName John
    and the LastName Smith in two distinct fields, I would
    like to build a new array that would contain all the
    original fields, but with John Smith in it only once.
    Thanks for: Colin Campbell

    /**
    * The same thing than implode function, but return the keys so
    *
    *
    * $_GET = array(‘id’ => ‘4587’,’with’ => ‘key’);
    * .
    * echo shared::implode_with_key(‘&’,$_GET,’=’); // Resultado:/> * .
    *
    *
    * @param string $glue Oque colocar entre as chave => valor
    * @param array $pieces Valores
    * @param string $hifen Separar chave da array do valor
    * @return string
    * @author memandeemail at gmail dot com
    */
    function implode_with_key ( $glue = null , $pieces , $hifen = ‘,’ ) <
    $return = null ;
    foreach ( $pieces as $tk => $tv ) $return .= $glue . $tk . $hifen . $tv ;
    return substr ( $return , 1 );
    >

    /**
    * Return unique values from a tree of values
    *
    * @param array $array_tree
    * @return array
    * @author memandeemail at gmail dot com
    */
    function array_unique_tree ( $array_tree ) <
    $will_return = array(); $vtemp = array();
    foreach ( $array_tree as $tkey => $tvalue ) $vtemp [ $tkey ] = implode_with_key ( ‘&’ , $tvalue , ‘=’ );
    foreach ( array_keys ( array_unique ( $vtemp )) as $tvalue ) $will_return [ $tvalue ] = $array_tree [ $tvalue ];
    return $will_return ;
    >

    $problem = array_fill ( 0 , 3 ,
    array( ‘FirstName’ => ‘John’ , ‘LastName’ => ‘Smith’ )
    );

    $problem [] = array( ‘FirstName’ => ‘Davi’ , ‘LastName’ => ‘S. Mesquita’ );
    $problem [] = array( ‘FirstName’ => ‘John’ , ‘LastName’ => ‘Tom’ );

    print_r ( array_unique_tree ( $problem ));
    ?>

    If you’re looking for the fastest way to remove duplicate words in a string, because you may do so in the millions (because it doesn’t matter if you do only some thousands) and use this code:

    $result = implode(» «, array_unique( explode(» «, $string) ));

    Then there is currently (2021) with the most recent PHP 7/8 versions only one faster alternative:

    $result = preg_replace(«/\b(\w+)\s+\\1\b/i», «$1», $string);

    will remove all consecutive duplicate words and it’s the fastest of all, taking only 30-40% of the time.

    $result = preg_replace(«/\b(\w+)\s+.*\\1\b/i», «$1», $string);

    will remove all duplicate words anywhere in the string, requiring about 80%-85% of the time.

    Of course, all speeds may vary depending on the length of your strings and their content. Please test for your case.

    Here is a solution to make unique values keeping empty values for an array with keys :

    function array_unique_kempty ( $array ) <
    $values = array_unique ( $array );
    $return = array_combine ( array_keys ( $array ), array_fill ( 0 , count ( $array ), null ));
    return array_merge ( $return , $values );
    >

    $myArray = [
    «test1» => «aaa» ,
    «test2» => null ,
    «test3» => «aaa» ,
    «test4» => «bbb» ,
    «test5» => null ,
    «test6» => «ccc» ,
    «test7» => «ddd» ,
    «test8» => «ccc»
    ];

    Create multidimensional array unique for any single key index.

    = [
    [ ‘id’ => 1 , ‘name’ => ‘ecortes’ , ‘phone’ => ‘1111111’ ],
    [ ‘id’ => 2 , ‘name’ => ‘canepa’ , ‘phone’ => ‘222222’ ],
    [ ‘id’ => 1 , ‘name’ => ‘john’ , ‘phone’ => ‘3333333’ ],
    ];

    function array_unique_multi ( $array , $key ) <
    return array_reduce ( $array , function( $acc , $curr ) use( $key ) <
    if(! in_array ( $curr [ $key ], array_column ( $acc , $key ))) <
    array_push ( $acc , $curr );
    >
    return $acc ;
    >, []);
    >

    //Call the function
    $unique_users = array_unique_multi ( $users , ‘id’ );

    //output
    $users = [
    [ ‘id’ => 1 , ‘name’ => ‘ecortes’ , ‘phone’ => ‘1111111’ ],
    [ ‘id’ => 2 , ‘name’ => ‘canepa’ , ‘phone’ => ‘222222’ ],
    ];
    ?>

    Following the Ghanshyam Katriya idea, but with an array of objects, where the $key is related to object propriety that you want to filter the uniqueness of array:

    function obj_multi_unique ( $obj , $key = false )
    <
    $totalObjs = count ( $obj );
    if ( is_array ( $obj ) && $totalObjs > 0 && is_object ( $obj [ 0 ]) && ( $key && ! is_numeric ( $key ))) <
    for ( $i = 0 ; $i $totalObjs ; $i ++) <
    if (isset( $obj [ $i ])) <
    for ( $j = $i + 1 ; $j $totalObjs ; $j ++) <
    if (isset( $obj [ $j ]) && $obj [ $i ]-> < $key >=== $obj [ $j ]->< $key >) <
    unset( $obj [ $j ]);
    >
    >
    >
    >
    return array_values ( $obj );
    > else <
    throw new Exception ( ‘Invalid argument or your array of objects is empty’ );
    >
    >
    ?>

    I required a function that removed a specific duplicate entry from an array and ignoring all others so came up with this:

    function specified_array_unique ( $array , $value )
    <
    $count = 0 ;

    if ( $array_value == $value ) $count ++;
    >

    return array_filter ( $array );
    >
    ?>

    Источник

  • Оцените статью