Empuje solo valores únicos en una matriz mientras realiza un bucle

5 minutos de lectura

avatar de usuario
Bagazo

Estoy usando el siguiente ciclo para agregar elementos a una matriz. Me gustaría saber si es posible de alguna manera no agregar $value hacia $liste matriz si el valor ya está en la matriz?

$liste = array();
foreach($something as $value){
     array_push($liste, $value);
}

  • Esto es un poco vago en los detalles. Depende un poco de lo que $value es. ¿Es un valor escalar? ¿Es consistentemente un número entero? ¿una cuerda? Dependiendo de este detalle vital, puede haber formas más eficientes que hacer llamadas repetidas de in_array().

    – mickmackusa

    29 de noviembre de 2021 a las 0:57


avatar de usuario
genérico

Compruebas si está ahí, usando in_arrayantes de empujar.

foreach($something as $value){
    if(!in_array($value, $liste, true)){
        array_push($liste, $value);
    }
}

los ,true permite la “comprobación estricta”. Esto compara elementos usando === en vez de ==.

  • Tenga en cuenta que, si $value es numérico y pasa a ser el mismo que una de las teclas (numéricas) en $liste, in_array() puede volver true incluso si no hay tal valor en la matriz. sugiero usar array_search() en su lugar y comparando fuertemente el resultado contra false.

    – Jazz

    10/04/2012 a las 20:37


  • @Jazz: ¿De qué estás hablando? in_array solo busca valores de matriz, no claves. ideone.com/JjkuP

    – genérico

    10/04/2012 a las 20:51


  • @Rocket, veo sus resultados, pero en el pasado recibí resultados diferentes. Es posible que el problema se haya solucionado antes de la 5.2.11.

    – Jazz

    10 de abril de 2012 a las 22:32

  • @Jazz: eso nunca fue un problema, ni siquiera en PHP 4. El problema probablemente estuvo en su código.

    – genérico

    10 de abril de 2012 a las 22:39

  • @Rocket, volví y miré. Tienes razón en que estoy caracterizando erróneamente el problema con in_array() — no tiene problemas con las teclas numéricas, pero sí con la conversión de tipos sueltos. ¡Mi error! En el código donde lo usé antes, usar el modo estricto no era una opción (necesitaba '2' comparar lo mismo que 2 pero no lo mismo que '2thing'). Todavía recomiendo que los nuevos desarrolladores de PHP usen array_search() aunque solo sea porque tiene menos “gotcha’s” que in_array(). La moraleja es: lo que sea que uses, asegúrate de saber cuándo no funcionará.

    – Jazz

    10 de abril de 2012 a las 22:46


Dos opciones realmente.

Opción 1: verifique cada elemento y no presione si el elemento está allí. Básicamente lo que estás pidiendo:

foreach($something as $value) {
    if( !in_array($value,$liste)) array_push($liste,$value);
}

Opción 2: Agréguelos de todos modos y elimine los duplicados después de:

foreach($something as $value) {
    array_push($liste,$value);
}
$liste = array_unique($liste);

Sin embargo, por lo que parece, es posible que solo estés buscando $liste = array_unique($something);.

  • ¿Cuál de estas dos opciones sería más eficiente?

    – kojow7

    30 de octubre de 2017 a las 4:28

  • @ kojow7 Parece que depende de la probabilidad de tener duplicados. Si la probabilidad de que un elemento se duplique es mayor que la de que no se duplique, entonces la primera opción es ciertamente más eficiente en mi humilde opinión. Sin embargo, si no es el caso, entonces el segundo parece más claro.

    – Omar Trkzi

    20 de junio a las 11:19


avatar de usuario
NoOorZ24

Como esta pregunta no utiliza el código de mejores prácticas para empezar, creo que todas las respuestas aquí son demasiado complicadas.

Resolviendo el código en cuestión:

Básicamente, lo que se intenta hacer en la pregunta en sí es filtrar las repeticiones. Mejor enfoque:

$liste = array_unique($something);

Si agrega elementos a una matriz que no está vacía:

$liste = array_unique(array_merge($liste, $something));

Si está utilizando array_push():

A menos que realmente esté utilizando el valor de retorno de la inserción de matriz, realmente debería usar:

$liste[] = $value;

para una sintaxis más corta y un aumento menor del rendimiento

  • Me gusta la brevedad/elegancia de esto. Otra frase podría ser: array_push($liste,...array_diff($something,$liste)); (No tengo idea de cómo se compararía esto con el rendimiento)

    – Cabecera

    23 de julio a las 15:47

La respuesta correcta es mucho más simple. Empuje todo, pero luego use array_unique() función:

array_push($array, $new_member);
$array = array_unique($array);

avatar de usuario
bjelli

tal vez quiera usarlo como una matriz asociativa en su lugar. se implementa como (algo así como) un tabla de picadillopor lo que obtiene un tiempo de inserción constante en lugar de lineal.

function find_uniq( $something ) {
    foreach($something as $value){
         $liste[$value]++;
    }
    return array_keys( $liste );
}

Si desea suprimir la advertencia, agregue el @ Regístrate en la línea tres.

Si desea evitar la advertencia, primero debe verificar su existencia:

function find_uniq( $something ) {
    foreach($something as $value){
      if (isset($liste[$value]))
        $liste[$value]++;
      else
        $liste[$value] = 1;
    }
    return array_keys( $liste );
}

avatar de usuario
genérico

Simplemente puede verificar esta condición antes de llamar array_push(). Usar array_search() y usar una fuerte comparación con false para ver si el valor está presente:

foreach( $something as $value ){
    if( array_search( $value, $liste, true ) === false ){
        array_push( $liste, $value );
    }
}

(Por cierto: Añadir ,true a array_search utilizar “comprobación estricta”. Esto usará === para comparaciones en lugar de ==)

avatar de usuario
Amir Fo

¡Tengo otra solución para ti! Puedes usar claves como valores Y las llaves nunca serán duplicadas.

$arr = ["A" => true, "B" => true, "C" => true];

$item = "A";
$arr[$item] = true;

Uso:

foreach($arr as $value => $helper){
    echo $value;
}

Establecer clase

OK, ¡déjame escribir una clase para ti! Los arreglos que no permiten elementos duplicados se denominan conjuntos.

class Set{
    private $countainer;

    public function get(){
        return $this->container;
    }
    public function push($item){
        $this->container[$item] = true;
    }
    public function delete($item){
        unset($this->container[$item]);
    }
}

Nota: Esto no funcionará para matrices y valores asociativos.

¿Ha sido útil esta solución?