Mon problème est que j'ai un tableau multidimensionnel qui publie du formulaire à PHP, maintenant je veux vérifier si les valeurs en double de certains index existent dans un tableau multidimensionnel ou non? par exemple:

$data=Array
(
    0 => Array
    (
        uid => '100',
        name => 'Sandra Shush',
        type => 'abc'
    ),
    1 => Array
    (
        uid  => '101',
        name => 'Sandra Shushtext',
        type => 'xyz'
    ),
    2 => Array
    (
        uid => '100',
        name => 'Sandra Shush',
        type => 'abc'
    )
);

Ici le nom et le type d'index 1 et 2 sont identiques, alors comment puis-je le vérifier?

Je suis familier avec

$key = array_search('abc', array_column($data, 'type'));

Mais c'est pour la duplication d'une valeur de colonne unique en plusieurs lignes, dans ma situation, si plusieurs colonnes de mêmes lignes sont identiques avec plusieurs colonnes de toute autre ligne, l'enregistrement sera considéré comme dupliqué.

Toute aide doit être appréciée, merci d'avance.

0
Imran Qamer 25 janv. 2017 à 11:09

4 réponses

Meilleure réponse

J'ai réalisé le scénario ci-dessus comme celui-ci:

Je ne sais pas lequel est le meilleur à moi ou celui qui a publié des réponses.

foreach($data as $key => $row)
{
    $combinedarr[] = array("name"=>$row["name"],"type"=>$row["type"]);
}
//chck if same facilitiy is being visit on same date twice
$countcomb = count($combinedarr);
$uniquearr = array_unique($combinedarr, SORT_REGULAR);
if($countcomb==count($uniquearr)){
}else{
    //yes duplicate exists
};

Merci encore pour ceux qui ont répondu.

0
Imran Qamer 27 janv. 2017 à 09:14

Il s'agit d'une approche très rapide et permet de trouver des doublons. Notez que les doublons sont des éléments qui ont la même valeur pour la même clé. Donc, si l'un des uid, name ou type correspond, ils seront traités comme des doublons. Par conséquent, j'ajuste le troisième élément du tableau, car tous les éléments de votre tableau partagent les mêmes valeurs.

$data = [
    ....
    2 =>
        [
            'uid'  => '200',
            'name' => 'Mandra Shush',
            'type' => 'abcx'
        ]
];

$duplicates      = [];
$valuesToCompare = ["uid", "name", "type"];

function equals($value, $toCompare, $keysToCompare)
{
    foreach ($keysToCompare as $compareKey) {
        if ($value[$compareKey] === $toCompare[$compareKey]) {
            return true;
        }
    }

    return false;
}

foreach ($data as $index => $element) {
    foreach ($data as $indexInner => $elementToCompare) {
        if ($index !== $indexInner) {
            if (equals($element, $elementToCompare, $valuesToCompare)) {
                $duplicates[] = [$index => $indexInner];
            }
        }
    }
}

var_dump($duplicates);

Cela produira ce qui suit, ce qui indique que nous avons trouvé 2 doublons. Où l'élément 0 est le double de 1 et 1 est le double de 0.

array (size=2)
  0 => 
    array (size=1)
      0 => int 1
  1 => 
    array (size=1)
      1 => int 0
1
cb0 25 janv. 2017 à 08:37

Le moyen le plus simple, du moins celui que j'utiliserais, est d'encoder vos tableaux dans une chaîne md5 (ou tout autre type) et de comparer ces valeurs.
Je pense que c'est le plus efficace dans votre cas.

Exemple:

<?php

function arrayToString($array) {
    $str = ''; 

    if ( !is_array($array) ) 
        return $str; 

    foreach ( $array as $key => $val ) {
        $str .= $key . ':' . $val; 
    }

    return $str; 
}

$data=Array
(
    0 => Array
    (
        'uid' => '100',
        'name' => 'Sandra Shush',
        'type' => 'abc'
    ),
    1 => Array
    (
        'uid'  => '100',
        'name' => 'Sandra Shush',
        'type' => 'xyz'
    ),
    2 => Array
    (
        'uid' => '100',
        'name' => 'Sandra Shush',
        'type' => 'abc'
    )
);

$temp = array(); 
foreach ( $data as $d ) {
    array_push($temp, md5(arrayToString($d))); 
}

$unique = array_unique($temp); 

var_dump($unique); // prints unique array
1
malutki5200 25 janv. 2017 à 08:36

Vous pouvez essayer d'utiliser array_reduce en créant une clé à l'aide des clés d'élément souhaitées:

$result = array_reduce($data, function ($carry, $item) {

    $key = $item['uid'] . $item['type'];

    $item['is_duplicate'] = isset($carry[$key]);

    if ($item['is_duplicate']) {
        $carry[] = $item;
    } else {
        $carry[$key] = $item;
    }

    return $carry;

}, []);

var_dump($result);
1
Mihai Matei 25 janv. 2017 à 08:32