2016-02-23 4 views
0

Я хотел бы написать что-то вроде

array_unique($a[] = $x) 

но он бросает мне уведомление:

array_unique() expects parameter 1 to be array, integer given. 

Есть ли способ, как избежать написания

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

?

+3

Что именно вы пытаетесь достичь? – Mureinik

+0

'array_unique' не добавляет элементы в массив, он удаляет повторяющиеся значения. – Qirel

+0

Нет, вы не можете упростить это. Если вы хотите добавить только массив, когда новая запись не существует в массиве, в каком-то месте, скрытом или очевидном, вам придется пройти тест. – Yoshi

ответ

0

Я могу думать о двух подходах.

Добавьте их, а затем удалите дубликаты.

Или используйте поиск массива (только потому, что он не является in_array, как вы просите) сначала проверить, если массив уже содержит значение.

<?php 

$array = array('foo', 'bar', 'baz'); 
$array[] = 'foo'; 
$array[] = 'bat'; 
$array = array_unique($array); // Remove duplicates 
var_dump($array); 
$array = array_values($array); // Re-index array if you don't want to preserve keys 
var_dump($array); 

$array = array('foo', 'bar', 'baz'); 
if(false === array_search('foo', $array)) $array[] = 'foo'; 
if(false === array_search('bat', $array)) $array[] = 'bat'; 
var_dump($array); 

Выход:

array (size=4) 
    0 => string 'foo' (length=3) 
    1 => string 'bar' (length=3) 
    2 => string 'baz' (length=3) 
    4 => string 'bat' (length=3) 

array (size=4) 
    0 => string 'foo' (length=3) 
    1 => string 'bar' (length=3) 
    2 => string 'baz' (length=3) 
    3 => string 'bat' (length=3) 

array (size=4) 
    0 => string 'foo' (length=3) 
    1 => string 'bar' (length=3) 
    2 => string 'baz' (length=3) 
    3 => string 'bat' (length=3) 
0

Я считаю, что вы пытаетесь сделать, это структура данных, которая автоматически дедуплицирует данные, как вы добавляете его (например, set() в Python). По умолчанию PHP не имеет ничего подобного.

два подхода:

  1. Используйте уникальный идентификатор элемента, как ключ:

    $a[$x['id']] = $x; 
    

    Это дает вам автоматическую дедупликации, очевидно.

  2. Реализовать что-то вроде set() как класс:

    class Set implements ArrayAccess { 
    
        protected $data = []; 
    
        public function offsetSet($offset, $value) { 
         if (is_null($offset)) { 
          $this->data[] = $value; 
         } else { 
          $this->data[$offset] = $value; 
         } 
         $this->data = array_unique($this->data); 
        } 
    
        public function offsetExists($offset) { 
         return isset($this->data[$offset]); 
        } 
    
        public function offsetUnset($offset) { 
         unset($this->data[$offset]); 
        } 
    
        public function offsetGet($offset) { 
         return isset($this->data[$offset]) ? $this->data[$offset] : null; 
        } 
    
    } 
    
    $a = new Set() 
    $a[] = 'foo'; 
    $a[] = 'foo'; // deduplicated 
    
+0

Кто приходит первым с $ a [$ x] = $ x ;? Вы или Джеруэн? –

+0

Вероятно, Расмус Лердорф. ;) – deceze

0

Вы всегда можете создать свою функцию :)

function my_array_unique($a, $val) { 
    $a[] = $val; 
    return array_unique($a); 
} 
+0

Откуда стоит $ x? – Progrock

+0

@Progrock спасибо, я исправил свой ответ –

Смежные вопросы