Ayuda con array_unique() en PHP

KZKG^Gaara

Administrator
Mensajes
282
Puntos de reacción
0
Puntos
0
Es simple, ando haciendo un trabajo en PHP y datos de MySQL, entonces:

  • Voy a saca datos de una tabla, necesito que esos datos vayan a un array
  • Luego necesito eliminar los datos duplicados de ese array
  • Para finalmente mostrarlos

O sea, supongamos que la consulta SQL es:
Código:
SELECT name FROM database.table WHERE age >= "18"

El resultado de esa consulta es:
Código:
Pedro
Maria
Ricardo
Pedro
Jose
Maria
Maria
Antonio

Como ven, "Maria" y "Pedro" se repiten, necesito que al final con un echo o algo (print_r?) mostrar el contenido del array PERO sin mostrar valores duplicados, o sea, que se muestre esto:
Código:
Pedro
Maria
Ricardo
Jose
Antonio

Nota: Me da igual el orden de los nombres, Pedro puede ir al principio o al final... eso me es indiferente.

Entonces, eh aquí el código que tengo hasta ahora:
Código:
                        $result = mysqli_query($conn, 'SELECT name FROM database.table WHERE age >= "18"');
                        $count = 0;
                        while($data = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
                            $usercheck[$count] =  $data['name'];
                        }
                            print_r (array_unique($usercheck));
                            echo "<br>";

Este código lo que me devuelve es:
Código:
Array ( [0] => Maria )
Array ( [0] => Jose )
Array ( [0] => Pedro )
Array ( [0] => Maria )
Array ( [0] => Maria )
Array ( [0] => Antonio ) 
Array ( [0] => Ricardo )

Al final variar el código (o cambiarlo por completo) me da igual, no es que el code tenga sí o sí que ser como lo escribí... lo que sea que al final me dé la información como quiero me servirá.
 
Tirare una piedra a ver si doy.

Código:
$arrayvalue = array_unique($usercheck, SORT_DESC);
foreach($arrayvalue as $unique){
   echo $unique;
}
 
Gaara ahi lo que veo es lo siguiente en esta linea
Código:
usercheck[$count] =  $data['name'];
a la variable $count debes sustituirla por
Código:
usercheck[$count++] =  $data['name'];
para que por cada ciclo se incremente de lo contrario como me pasa a mi te retornara 1 sola fila.

todo lo demas lo veo bien.
 
Código:
$data = []; //PHP > 5.3

$data[0] = "Pepe";
$data[1] = "Adrian";
$data[2] = "Pepe";
$data[3] = "Carlos";

$res = array_unique($data); //No ordena el indice o las "keys"

sort($res); //Ordena el indice de forma ascendent. Sort recibe un array por referencia

print_r($res);

//Salida del codigo anterior con sort --- Array ( [0] => Adrian [1] => Carlos [2] => Pepe ) 

//Salida del codigo anterior sin sort --- Array ( [0] => Adrian [1] => Carlos [3] => Pepe )

No obstante en php > 5.3 puedes hacer esto
Código:
 $arr = [];
 $iterations = 5;
 for($i = 0; $i < $iterations; $i++)
{
   $arr[] = $i; //Arr en i se llena con i y se crean 5 pocisiones en arr de forma totalmente dinamica
}
//Salida del codigo anterior ---- Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 )
 
Dvd dijo:
No obstante en php > 5.3 puedes hacer esto
Código:
 $arr = [];
 $iterations = 5;
 for($i = 0; $i < $iterations; $i++)
{
   $arr[] = $i; //Arr en i se llena con i y se crean 5 pocisiones en arr de forma totalmente dinamica
}
//Salida del codigo anterior ---- Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 )

Preferiria usar "foreach" asi nos ahorramos tener que definir la cantidad de elementos para $i en "for", y otras especificaciones.
 
Es lo mismo
Cuando dices
Código:
  foreach($enumerators as $enum)
{
  //TODO
}

//Enum se crea como elemento actual del array. En el for es el indice actual. La diferencia es minima pero no con respecto a la variable
 
Una pregunta, porque datos duplicados en la base de datos? creo que, si creas un método para impedir que se dupliquen esos datos te sería más fácil y mantendrías la DB organizada y limpia.
 
dukenukem dijo:
Una pregunta, porque datos duplicados en la base de datos? creo que, si creas un método para impedir que se dupliquen esos datos te sería más fácil y mantendrías la DB organizada y limpia.

La cuestion es, nos piden resolver un problema, a partir de la informacion que nos dan, ejemplo "juanito trajo 10 naranjas y quiere repartirlas entre 3 personas. ¿Como debe proceder Juanito?", la solucion del problema no puede ser, "si juanito no fuera tan despistado, sabiendo que habrian 3 personas, hubiese traido una cantidad de naranjas que fuese divisible por 3, dando como resultado un numero entero".
 
DiedByDisgust dijo:
dukenukem dijo:
Una pregunta, porque datos duplicados en la base de datos? creo que, si creas un método para impedir que se dupliquen esos datos te sería más fácil y mantendrías la DB organizada y limpia.

La cuestion es, nos piden resolver un problema, a partir de la informacion que nos dan, ejemplo "juanito trajo 10 naranjas y quiere repartirlas entre 3 personas. ¿Como debe proceder Juanito?", la solucion del problema no puede ser, "si juanito no fuera tan despistado, sabiendo que habrian 3 personas, hubiese traido una cantidad de naranjas que fuese divisible por 3, dando como resultado un numero entero".

Estamos claro de eso pero igual a lo mejor le sirve el consejo
 
Cuando se trate de una colecta de datos arbitraria pueden aparecer datos repetidos.
Por ejemplo las visitas del mismo usuario a la web
Cuantos usuarios han descargado un programa

etc
etc
 
Dvd dijo:
Cuando se trate de una colecta de datos arbitraria pueden aparecer datos repetidos.
Por ejemplo las visitas del mismo usuario a la web
Cuantos usuarios han descargado un programa

etc
etc


Si hay grandes bases de datos que al final lo quieras o no los datos se van a duplicar por eso a las DB tambien se les da mantenimiento.
 
hay sus casos en que este tipo de datos puede estar repetido y no estar mal disennada la bd, solo que no se me ocurre ahora mismo un caso de esos en el que se necesite hacer lo que quiere hacer gaara pero el sabra pero diox que cantidad de codigo han puesto cuando no pensaron nunca en la base, pa que mas codigo y mas iteraciones y mas carga al codigo cuando se puede hacer desde la misma consulta a la BD como dice guamulo. En muchas ocasiones no siempre lo ideal es algo que de una respuesta sino una que la de y logre optimizar un poco
 
Personalmente pienso que mientras menos carga se le asigne a la consulta o a un servidor de base de datos mejor. Es mas rapido el procesamiento de formato de cadenas que la indizacion de datos. Por lo que usar MySQL para hacer consultas largas es un poco incoveniente incluso usando llamadas asincronas. La espera es tediosa. He trabajado con el analisis de cadenas de texto y aunque el codigo quede espagueti es mucho mas eficiente que esperar la consulta de mysql.

Esto no se aplica a cualquier caso
 
hay casos en los que no, pero en la mayoria de casos que trabajan sobre un conjunto de elementos es mejor realizarlo sobre la propia consulta, solo piensa que en este caso una vez obtengas la respuesta tendras q iterar de nuevo por todos los elementos para eliminar los q esten repetidos, en todos los ejemplos que pusieron usan siempre un recorrido, recorrido que se evita utilizando el propio recorrido q realiza la consulta a la base de datos, ademas de que ya esa funcion esta optimizada para que se haga de la forma mas eficiente posible. Los recorridos no se hacen notar en aplicaciones sencillas o de escritorio, pero cuando tienes recorridos de millones de datos en la bd y encima de eso miles de usos de ese metodo al mismo tiempo (caso hipotetico q aqui en snet es extremadamente dificil q pase) ahi si ya se nota la diferencia entre hacerlo en la misma consulta o despues de obtener los resultados
 
Haz como dice guamulo en la consulta de la BD pon SELECT DISTINCT ... y te los muestra todos sin repetir
 
Atrás
Arriba