добавить в массив, если он еще не существует

Как добавить элементы в массив только в том случае, если их еще нет? У меня есть следующее:

$a=array(); // organize the array foreach($array as $k=>$v){ foreach($v as $key=>$value){ if($key=='key'){ $a[]=$value; } } } print_r($a); 

// Вывод

 Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 1 [4] => 2 [5] => 3 [6] => 4 [7] => 5 [8] => 6 ) 

Вместо этого я хочу, чтобы $ a состоял из уникальных значений. (Я знаю, что могу использовать array_unique для получения желаемых результатов, но я просто хочу знать)

Вам нужно будет проверить каждое значение против in_array :

 $a=array(); // organize the array by cusip foreach($array as $k=>$v){ foreach($v as $key=>$value){ if(!in_array($value, $a)){ $a[]=$value; } } } 

Вы должны использовать функцию PHP in_array (см. http://php.net/manual/en/function.in-array.php ).

 if (!in_array($value, $array)) { $array[] = $value; } 

Вот что говорит документация о in_array : Возвращает TRUE, если в массиве найдена игла, FALSE в противном случае.

Поскольку у вас, кажется, есть только скалярные значения , массив PHP скорее представляет собой хеш-карту, вы можете использовать это значение как ключ, чтобы избежать дублирования и связывать ключи $k с ними, чтобы получить исходные значения:

 $keys = array(); foreach ($array as $k => $v){ if (isset($v['key'])) { $keys[$value] = $k; } } 

Затем вам просто нужно выполнить итерацию, чтобы получить исходные значения:

 $unique = array(); foreach ($keys as $key) { $unique[] = $array[$key]['key']; } 

Это, вероятно, не самый очевидный и наиболее полный подход, но он очень эффективен, как и в O ( n ).

Использование in_array как и другие, возможно, более интуитивно понятное. Но в итоге вы получите алгоритм в O ( n 2 ) ( in_array находится в O ( n )), который неприменим. Даже нажатие всех значений в массиве и использование array_unique на нем было бы лучше, чем in_array ( array_unique сортирует значения в O ( n · log n ), а затем удаляет последовательные дубликаты).

 if (!in_array(...)) array_push(..) 
 if (!in_array($value, $a)) $a[]=$value; 

Если вы не заботитесь о заказе ключей, вы можете сделать следующее:

 $array = YOUR_ARRAY $unique = array(); foreach ($array as $a) { $unique[$a] = $a; } 

Попробуйте добавить в качестве ключа вместо значения:

Добавление записи

 function addEntry($entry) { $this->entries[$entry] = true; } 

Получение всех записей

 function getEntries() { return array_keys($this->enties); } 

Поскольку существует множество способов достижения желаемых результатов, и так много людей предоставили !in_array() в качестве ответа, и OP уже упоминает использование array_unique , я хотел бы предоставить пару альтернатив.

Используя array_diff (php> = 4.0.1 || 5), вы можете отфильтровать только новые значения массива, которые не существуют. В качестве альтернативы вы также можете сравнить ключи и значения с array_diff_assoc . http://php.net/manual/en/function.array-diff.php

 $currentValues = array(1, 2); $newValues = array(1, 3, 1, 4, 2); var_dump(array_diff($newValues, $currentValues)); 

Результат:

 Array ( [1] => 3 [3] => 4 ) 

http://ideone.com/SWO3D1

Другой метод использует array_flip для назначения значений в качестве ключей и сравнения их с помощью isset , который будет работать намного быстрее, чем in_array с большими наборами данных. Опять же, это отфильтровывает только новые значения, которые еще не существуют в текущих значениях.

 $currentValues = [1, 2]; $newValues = [1, 3, 1, 4, 2]; $a = array(); $checkValues = array_flip($currentValues); foreach ($newValues as $v) { if (!isset($checkValues[$v])) { $a[] = $v; } } 

Результат:

 Array ( [0] => 3 [1] => 4 ) 

http://ideone.com/cyRyzN

С помощью любого из этих методов вы можете использовать array_merge для добавления уникальных новых значений к вашим текущим значениям.

  1. http://ideone.com/JCakmR
  2. http://ideone.com/bwTz2u

Результат:

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

Легко писать, но не самый эффективный:

 $array = array_unique(array_merge($array, $array_to_append)); 

Вероятно, это быстрее:

 $array = array_merge($array, array_diff($array_to_append, $array)); 

вы можете попробовать использовать «in_array»:

 function insert_value($value, &$_arr) { if (!in_array($value, $_arr)) { $_arr[] = $value; } } 

Понимая идею Gumbo , работа над кодом:

 $array = array('111111','222222','3333333','4444','5555', 'AAAAAA', 'BBBBBB', 'CCC', 'DDDDDDD', 'EEEEEEEE', 'FFFFFF', 'GGG', 'AAAAAA', 'BBBBBB', 'CCC', 'DDDDDDD', 'EEEEEEEE', 'FFFFFF', 'GGG', '222222', '666666', '777777', 'HHHH'); print_r($array); $keys= array(); foreach ($array as $k => $v){ if (isset($v['value'])) { $keys[$v] = $k; } } $unique = array(); foreach ($keys as $key) { $unique[] = $array[$key]; } print "<br><br>"; print_r($unique); 

Дает следующее:

 Array ( [0] => 111111 [1] => 222222 [2] => 3333333 [3] => 4444 [4] => 5555 [5] => AAAAAA [6] => BBBBBB [7] => CCC [8] => DDDDDDD [9] => EEEEEEEE [10] => FFFFFF [11] => GGG [12] => AAAAAA [13] => BBBBBB [14] => CCC [15] => DDDDDDD [16] => EEEEEEEE [17] => FFFFFF [18] => GGG [19] => 222222 [20] => 666666 [21] => 777777 [22] => HHHH ) Array ( [0] => 111111 [1] => 222222 [2] => 3333333 [3] => 4444 [4] => 5555 [5] => AAAAAA [6] => BBBBBB [7] => CCC [8] => DDDDDDD [9] => EEEEEEEE [10] => FFFFFF [11] => GGG [12] => 666666 [13] => 777777 [14] => HHHH ) 

Попробуйте этот код, я получил его отсюда

 $input = Array(1,2,3,1,2,3,4,5,6); $input = array_map("unserialize", array_unique(array_map("serialize", $input)));