Comment puis-je vérifier et supprimer des tableaux en double?

Exemple:

$a = array(
   array(
      'id' => 1,
      'name' => 'test'
   ),
   // Next array is equal to first, then delete
   array(
      'id' => 1,
      'name' => 'test'
   ), 
   // Different array, then continue here
   array(
      'id' => 2,
      'name' => 'other'
   )
);

Si le tableau est le même, supprimez le doublon et obtenez un seul tableau.

0
Vinícius Duarte 20 nov. 2018 à 23:01

3 réponses

Meilleure réponse

Vous pouvez utiliser une table de recherche stockant des tableaux sérialisés. Si un tableau existe déjà dans la table de recherche, vous avez un doublon et pouvez épisser la clé:

$a = array(
   array(
      'id' => 1,
      'name' => 'test'
   ),
   array(
      'id' => 1,
      'name' => 'test'
   ), 
   array(
      'id' => 2,
      'name' => 'other'
   )
);

$seen = [];

for ($i = count($a) - 1; $i >= 0; $i--) {
    if (array_key_exists(json_encode($a[$i]), $seen)) {
        array_splice($a, $i, 1);
    }
    else {
        $seen[json_encode($a[$i])] = 1;
    }
}

print_r($a);

Production:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => test
        )

    [1] => Array
        (
            [id] => 2
            [name] => other
        )

)

Essayez!

0
ggorlen 20 nov. 2018 à 20:11

Vous pouvez parcourir le tableau parent, sérialiser chaque tableau enfant et l'enregistrer dans un troisième tableau, et pendant que vous bouclez, vérifiez l'existence de la série de chaque tableau enfant suivant par rapport à tous les précédents enregistrés dans le troisième tableau. S'il existe, supprimez le doublon actuel du tableau parent par clé. La fonction ci-dessous le démontre.

function remove_duplicate_nested_arrays($parent_array)

  $temporary_array = array(); // declare third, temporary array.

  foreach($parent_array as $key =>  $child_array){ // loop through parent array
    $child_array_serial = serialize($child_array); // serialize child each array
    if(in_array($child_array_serial,$temporary_array)){ // check if child array serial exists in third array
      unset($parent_array[$key]); // unset the child array by key from parent array if it's serial exists in third array
      continue;
    }
    $temporary_array[] = $child_array_serial; // if this point is reached, the serial of child array is not in third array, so add it so duplicates can be detected in future iterations.
  }
  return $parent_array;
}

Cela peut également être réalisé en 1 ligne, en utilisant la suggestion @Jose Carlos Gp comme suit:

$b = array_map('unserialize', array_unique(array_map('serialize', $a)));

La fonction ci-dessus élargit en quelque sorte ce qui se passe réellement dans la solution 1 liner.

0
coderodour 20 nov. 2018 à 20:43

Array_unique ()

Exemple:

$array = array(1, 2, 2, 3);
    $array = array_unique($array); // Array is now (1, 2, 3)
0
Jose Carlos Gp 20 nov. 2018 à 20:08