7
votes

PHP: Vérifiez les valeurs dupliquées dans une matrice multidimensionnelle

J'ai ce problème avec des tableaux multidimensionnels.

Compte tenu de la matrice multidimensionnelle suivante: xxx

Je veux vérifier ses valeurs et trouver des doublons 0, 2 et 3) ne laissant qu'une seule touche - paire de valeurs supprime les autres, entraînant quelque chose comme celui-ci: xxx

Comment puis-je faire cela ??


1 commentaires

6 Réponses :


8
votes

Vous pouvez simplement le faire en utilisant in_array () xxx

qui vous obtiendra quelque chose comme xxx


0 commentaires

15
votes

Cela supprimera les éléments en double de votre tableau à l'aide de array_unique () code> :

$new_arr = array_unique($arr, SORT_REGULAR);


8 commentaires

-1 Regardez les docs. Cela convertira les valeurs de la matrice en cordes avant de comparer.


@Artefacto: Regardez les documents. J'utilise le drapeau sort_regulaire qui n'utilise pas la comparaison de chaînes.


Selon le document PHP "Notez que Array_unique () n'est pas destiné à travailler sur des tableaux multidimensionnels.". On peut voir à partir du lien donné.


@Tim ah désolé. Au moins, mon objection n'est pas valide. Renversé.


@enam je pense que cela signifie simplement que array_unique n'aplatit pas le tableau pour trouver les uniques. (BTW, +1)


Pensée Array_unique ne fonctionne pas avec des tableaux multidimensionnels.


@ARTEFACTO Merci pour la clarification ... :) Je ne pense jamais que cette fonction de cette façon!


Downvote parce que l'op indique spécifiquement une matrice multidimensionnelle



0
votes
$arr = ...;
$final = array();
sort($arr);
foreach ($arr as $el) {
   if (!isset($prev) || $el !== $prev)
       $final[] = $el
    $prev = $el;
}
This is a more efficient1 solution (log n + n instead of quadratic) but it relies on a total order between all the elements of the array, which you may not have (e.g. if the inner arrays have objects).1 More efficient than using in_array. Turns out array_unique actually uses this algorithm, so it has the same shortcomings.

0 commentaires

1
votes

Vous pouvez aller intelligent avec la sérialisation de la comparaison des tableaux.

var_dump(makeUnique($data));

function makeUnique(array $data)
{
    $serialized = array_map(create_function('$a', 'return serialize($a);'), $data);
    $unique = array_unique($serialized);
    return array_intersect_key($unique, $data);
}


0 commentaires

0
votes

Pour vérifier à l'aide d'Array_Unique sur des tableaux multidimensionnels, vous devez l'aplatiser comme si, à l'aide de l'implication.

    $c=count($array)
    for($i=0;$i<$c;$i++)
    {
    $flattened=implode("~",$array[$i]);
    $newarray[$i]=$flattened;
     }
    if(count(array_unique($newarray)
    <count($newarray))
    {
    //returns true if $array contains duplicates
    //can also use array_unique on $newarray 
    //to remove   duplicates, then explode, 
    //to return to default state
    }


1 commentaires

Pourriez-vous corriger l'erreur de codage ?



0
votes
**This is example array**
$multi_com=[
    [
        {
            "combination_id": "19"
        },
        {
            "combination_id": "20"
        },
        {
            "combination_id": "21"
        }
    ],
    [
        {
            "combination_id": "18"
        },
        {
            "combination_id": "20"
        },
        {
            "combination_id": "22"
        }
    ],
    [
        {
            "combination_id": "20"
        },
        {
            "combination_id": "21"
        }
    ]
]

**This is sample code**
        $array1 = [];
        $array2 = [];
        $status = false;
        foreach ($multi_com as $key => $val) {
            foreach ($val as $key2 => $val2) {
                if (count($array1) !== 0) {
                    $array_res = in_array($val2->combination_id, $array1);
                    if ($array_res) {
                        $array2[] = $val2->combination_id;
                    }
                }
            }

            if (!$status) {
                for ($x = 0; $x < count($val); $x++) {
                    $array1[] = $val[$x]->combination_id;
                }
            } else {
                $array1 = [];
                $array1 = $array2;
                $array2 = [];
            }
            $status = true;
        }

        return $array1;

1 commentaires

Retour $ Array1 = [20]