условие — как упростить if (! in_array ($ x, $ a)) $ a [] = $ x; в php?

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

array_unique( $a[] = $x )

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

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

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

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

?

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

Другие решения

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

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

Или используйте поиск по массиву (только потому, что это не 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

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

function my_array_unique($a, $val) {
$a[] = $val;
return array_unique($a);
}
0
По вопросам рекламы [email protected]