Как добавить элементы в массив только в том случае, если их еще нет? У меня есть следующее:
$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 )
Другой метод использует 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 )
С помощью любого из этих методов вы можете использовать array_merge
для добавления уникальных новых значений к вашим текущим значениям.
Результат:
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)));