Я хотел бы написать что-то вроде
array_unique( $a[] = $x )
но это бросает мне уведомление:
array_unique() expects parameter 1 to be array, integer given.
Есть ли способ, как избежать написания
if ( ! in_array( $x, $a ) ) $a[] = $x;
?
Я считаю, что вы пытаетесь сделать структуру данных, которая автоматически дедуплицирует данные по мере их добавления (например, 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
Я могу думать о двух подходах.
Добавьте их, а затем удалите дубликаты.
Или используйте поиск по массиву (только потому, что это не 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)
Вы всегда можете создать свою функцию 🙂
function my_array_unique($a, $val) {
$a[] = $val;
return array_unique($a);
}