PHP: eliminación de valores duplicados

Tengo 2 matrices con, por ejemplo, 1000 teclas cada una, una tiene un valor de temperatura y la otra la hora.

Temporal de matriz de ejemplo:

[0] = 3.1
[1] = 4.3
[2] = 4.1
[3] = 5.1
[4] = 4.1

Ejemplo de matriz de horas:

[0] = 0
[1] = 1
[2] = 2
[3] = 3
[4] = 3

El problema con esto es que cuando los combino en matrices y los trazo en, por ejemplo, pchart, tengo demasiados valores en la X y se desordena.
Entonces, lo que necesito para eliminar las horas duplicadas y reemplazarlas con "NULL", para que las horas innecesarias no se representen en el eje x.
Quiero mantener la primera hora en la matriz, la segunda hasta el final de los duplicados se puede establecer en "NULL"

La matriz de salida de horas debe ser:

[0] = 0
[1] = 1
[2] = 2
[3] = 3
[4] = NULL
etc.

preguntado el 03 de mayo de 12 a las 17:05

5 Respuestas

Suena como un trabajo para array_unique().

array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )

Toma una matriz de entrada y devuelve una nueva matriz sin valores duplicados.

Tenga en cuenta que las claves se conservan. array_unique() ordena los valores tratados como cadena al principio, luego mantendrá la primera clave encontrada para cada valor e ignorará todas las claves siguientes. No significa que se mantendrá la clave del primer valor relacionado de la matriz no ordenada.

Nota: dos elementos se consideran iguales si y solo si (string) $elem1 === (string) $elem2. En palabras: cuando la representación de la cadena es la misma. Se utilizará el primer elemento.


Si necesita que las claves de matriz persistan, puede probar algo con array_map().

<?php

//Variable initialization
$array = array(
    0 => 0,
    1 => 1,
    2 => 2,
    3 => 3,
    4 => 3
);
$temp  = array();

$array = array_map(function($element) use (&$temp) {
    if (!in_array($element, $temp)) {
        $temp[] = $element;
        return $element;
    }
    return null;
}, $array);

print_r($array);

contestado el 03 de mayo de 12 a las 18:05

Podría ser, pero necesito mantener la misma cantidad de claves en ambas matrices. Las claves duplicadas en la matriz de horas deben establecerse en NULL, no eliminarse.. - Hiperdiablo

@HyperDevil: Edité mi respuesta. Intentará encontrar una mejor manera que los globales. - Fantasma de Madara

Su matriz está ordenada, así que... ¿qué tal esto?

$hours = array(0,1,2,3,3,4,4,5);
$prev = -1;
foreach ($hours as &$hour) {
  if ($prev === $hour) {
    $hour = NULL;
  }
  else {
    $prev = $hour;
  }
}
unset($hour);
print_r($hours); // 0,1,2,3,NULL,4,NULL,5...

contestado el 03 de mayo de 12 a las 18:05

Si está utilizando php 5.3:

$a = array(0,1,2,3,4,4,5);

array_walk($a, function(&$item) {
  static $encountered = array();
  if(in_array($item, $encountered)) {
    $item = null;
    return;
  }
  $encountered[] = $item;
});

var_dump($a);

Conservará el número de llaves. Array_walk llama a una función de usuario para cada tecla. static hace que la matriz $ encontrada en el alcance de la función permanezca entre ejecuciones.

contestado el 03 de mayo de 12 a las 18:05

Si desea eliminar los duplicados por completo, puede usar array_unique () pero no los establecerá en NULL.

contestado el 03 de mayo de 12 a las 18:05

Tal vez este truco lo haga:

$simplified = array_combine($hours, $temperatures);

$hours = array_keys($simplified);
$temperatures = array_values($simplified);

Esto no establecerá las cosas en NULL, sino que las eliminará por completo, lo que creo que es lo que está buscando. De lo contrario, esto debería hacerlo:

foreach(array_slice(array_reverse(array_keys($hours)), 0, -1) as $i)
    ($hours[$i] === $hours[$i-1]) && $hours[$i] = NULL;

Demo

contestado el 03 de mayo de 12 a las 18:05

No estoy seguro de que realmente lo necesites. Pruébalo e informa (a menos que no pruebes esto, no confiaré en ti :)) - hakré

¿Cómo es esto mejor/diferente que usar array_unique() ¿en ambos? - Fantasma de Madara

@Verdad: se conserva la relación entre ambas matrices (lo que parece ser necesario para un gráfico o diagrama). - hakré

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.