Подтвердить что ты не робот

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

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

$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 для получения желаемых результатов, но я просто хочу знать)

4b9b3361

Ответ 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;
        }
    }
}

Ответ 2

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

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

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

Ответ 3

Поскольку у вас есть только скалярные значения, массив 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), а затем удаляет последовательные дубликаты).

Ответ 4

if (!in_array(...))  
  array_push(..)

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

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

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

Ответ 8

Поскольку существует множество способов достижения желаемых результатов, и поэтому многие люди предоставили !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 для добавления уникальных новых значений к вашим текущим значениям.

Результат:

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

Ответ 9

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

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

Это, вероятно, быстрее:

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

Ответ 10

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

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

Ответ 11

Взяв идею 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
)

Ответ 12

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

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