Ответ 1
Вам нужно будет проверить каждое значение в 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;
}
}
}
Как добавить элементы в массив только в том случае, если они уже не там? У меня есть следующее:
$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)));