Я хотел бы написать что-то вроде
array_unique($a[] = $x)
но он бросает мне уведомление:
array_unique() expects parameter 1 to be array, integer given.
Есть ли способ, как избежать написания
if (! in_array($x, $a)) $a[] = $x;
?
Я хотел бы написать что-то вроде
array_unique($a[] = $x)
но он бросает мне уведомление:
array_unique() expects parameter 1 to be array, integer given.
Есть ли способ, как избежать написания
if (! in_array($x, $a)) $a[] = $x;
?
Я могу думать о двух подходах.
Добавьте их, а затем удалите дубликаты.
Или используйте поиск массива (только потому, что он не является 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)
Я считаю, что вы пытаетесь сделать, это структура данных, которая автоматически дедуплицирует данные, как вы добавляете его (например, set()
в Python). По умолчанию PHP не имеет ничего подобного.
два подхода:
Используйте уникальный идентификатор элемента, как ключ:
$a[$x['id']] = $x;
Это дает вам автоматическую дедупликации, очевидно.
Реализовать что-то вроде 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
Кто приходит первым с $ a [$ x] = $ x ;? Вы или Джеруэн? –
Вероятно, Расмус Лердорф. ;) – deceze
Вы всегда можете создать свою функцию :)
function my_array_unique($a, $val) {
$a[] = $val;
return array_unique($a);
}
Откуда стоит $ x? – Progrock
@Progrock спасибо, я исправил свой ответ –
Что именно вы пытаетесь достичь? – Mureinik
'array_unique' не добавляет элементы в массив, он удаляет повторяющиеся значения. – Qirel
Нет, вы не можете упростить это. Если вы хотите добавить только массив, когда новая запись не существует в массиве, в каком-то месте, скрытом или очевидном, вам придется пройти тест. – Yoshi