1
votes

Supprimer un tableau consécutif avec des valeurs en double dans un tableau multidimensionnel à l'aide de PHP

Je travaille sur une fonction qui filtre un tableau multidimensionnel, si les tableaux successifs ont la même valeur, je dois supprimer les tableaux intermédiaires et obtenir uniquement le premier et le dernier des tableaux successifs avec des valeurs en double.

I Je ne sais pas comment faire cela.

J'espère que vous pourrez m'aider.

Merci.

EXEMPLE DE CODE

Array ( 
    [0] => Array ( 
        [key] => 0 
        [value] => 25 
        )  
    [2] => Array ( 
        [key] => 2 
        [value] => 25 
        ) 
    [3] => Array ( 
        [key] => 3 
        [value] => 33 
        )    
    [4] => Array ( 
        [key] => 4 
        [value] => 45 
        ) 
    [5] => Array ( 
        [key] => 5 
        [value] => 66 
        ) 
    [8] => Array ( 
        [key] => 8 
        [value] => 66 
        ) 
    [9] => Array ( 
        [key] => 9 
        [value] => 55 
        ) 
    )

Exemple de tableau

Array ( 
    [0] => Array ( 
        [key] => 0 
        [value] => 25 
        ) 
    [1] => Array ( 
        [key] => 1 
        [value] => 25 
        ) 
    [2] => Array ( 
        [key] => 2 
        [value] => 25 
        ) 
    [3] => Array ( 
        [key] => 3 
        [value] => 33 
        )    
    [4] => Array ( 
        [key] => 4 
        [value] => 45 
        ) 
    [5] => Array ( 
        [key] => 5 
        [value] => 66 
        ) 
    [6] => Array ( 
        [key] => 6 
        [value] => 66 
        ) 
    [7] => Array ( 
        [key] => 7 
        [value] => 66 
        ) 
    [8] => Array ( 
        [key] => 8 
        [value] => 66 
        ) 
    [9] => Array ( 
        [key] => 9 
        [value] => 55 
        ) 
    )

Ici, les 3 premiers tableaux ont les mêmes valeurs (25), je dois supprimer le 2ème tableau et conserver le 1er et le 3ème, également avec le 6ème au 9ème ne conserver que le 6ème et le 9ème tableau.

Résultat attendu

function removeDuplicates($array){
    $result = [];
    $count = 0;
    $firstValue = null;

    for ($i = 0; $i < count($array); $i++) {

        if($array[$i]['id'] == firstValue){

            $result[] = $array[$i]);

        }else{

            // do action

        }

    }

    return $array;

}


2 commentaires

Voulez-vous conserver les clés?


Oui s'il vous plaît.....


4 Réponses :


0
votes

Voici la solution: Votre tableau ressemble à ceci:

function testArray()
    {
        $array = [
            ["key" => 0, "value" => 25],
            ["key" => 1, "value" => 25],
            ["key" => 2, "value" => 25],
            ["key" => 3, "value" => 33],
            ["key" => 4, "value" => 45],
            ["key" => 5, "value" => 66],
            ["key" => 6, "value" => 66],
            ["key" => 7, "value" => 66],
            ["key" => 8, "value" => 66],
            ["key" => 9, "value" => 55],
        ];
        $processedItems = [];
        $newArray = [];
        foreach ($array as $index => $item) {
            if (in_array($item["value"], $processedItems))
                continue;
            $processedItems[] = $item["value"];
            $firstIndex = search($item["value"], $array);
            $lastIndex = search($item["value"], array_reverse($array, true));
            $newArray[$firstIndex] = $array[$firstIndex];
            if ($firstIndex != $lastIndex)
                $newArray[$lastIndex] = $array[$lastIndex];
        }
        print_r($newArray);
    }

    function search($search, $array)
    {
        foreach ($array as $key => $val) {
            if ($val['value'] === $search) {
                return $key;
            }
        }

        return null;
    }

tout d'abord, recherchez la première et la dernière occurrence de chaque valeur. Vous avez besoin d'une méthode qui parcourt le tableau et trouve la valeur exacte. Regardez ceci:

function search($search, $array)
    {
        foreach ($array as $key => $val) {
            if ($val['value'] === $search) {
                return $key;
            }
        }

        return null;
    }

L'exécution de $ firstOccurrence = search (25, $ array) trouvera la première occurrence de 25 code >.

Maintenant, pour trouver l'index de la dernière occurrence, nous devrions inverser le tableau pour aller à partir de la fin du tableau. Donc $ lastOccurrence = search (25, array_reverse ($ array, true)) trouvera le dernier index d'occurrence de 25.

Ok, quand nous traitons chaque valeur, donc, nous ne devrions pas la traiter à nouveau. Nous avons donc besoin d'un tableau qui contiendra les valeurs qui seront traitées.

Code final:

$array = [
            ["key" => 0, "value" => 25],
            ["key" => 1, "value" => 25],
            ["key" => 2, "value" => 25],
            ["key" => 3, "value" => 33],
            ["key" => 4, "value" => 45],
            ["key" => 5, "value" => 66],
            ["key" => 6, "value" => 66],
            ["key" => 7, "value" => 66],
            ["key" => 8, "value" => 66],
            ["key" => 9, "value" => 55],
        ];


1 commentaires

merci pour la réponse monsieur , il y a une erreur dans cette ligne $ firstIndex = $ this-> search ($ item ["value"], $ array); Erreur non interceptée: utilisation de $ this quand il n'est pas dans l'objet le contexte



1
votes

Essayez ceci:

$array = [
        ["key" => 0, "value" => 25],
        ["key" => 1, "value" => 25],
        ["key" => 2, "value" => 25],
        ["key" => 3, "value" => 33],
        ["key" => 4, "value" => 45],
        ["key" => 5, "value" => 66],
        ["key" => 6, "value" => 66],
        ["key" => 7, "value" => 66],
        ["key" => 8, "value" => 66],
        ["key" => 9, "value" => 55],
];

for ($i = 0; $i < count($array); $i++) {
    if (!isset($array[$i])){
        continue;
    }
    if ($array[$i]['value'] == $array[$i+1]['value']) {
        $j = 1;
        while ($array[$i]['value'] == $array[$i+$j+1]['value']) {
            unset($array[$i+$j]);
            $j += 1;
        }
    }
}

print_r($array);

Puisque vous avez besoin de conserver les clés, la boucle for lancera une notification lorsqu'un élément n'est pas défini. C'est pourquoi nous vérifions d'abord si un élément existe.

Ensuite, la boucle recherche deux valeurs identiques consécutives à savoir $ i et $ i + 1 code >. Une fois qu'il les trouve, il entre dans une boucle while pour tester 3 valeurs identiques consécutives ou plus. Il ne désarmera un élément consécutif que s'il y a au moins une occurrence avant et une après. Par exemple, il supprimera $ i + 2 uniquement si $ i + 3 est identique.

J'espère que cela vous aidera!

p>


3 commentaires

salut, merci pour la réponse, je teste votre code avec mon exemple de tableau, seuls les premiers doublons successifs (valeurs avec 25) fonctionnent, mais le tableau avec des valeurs de 66 ne fonctionne pas.


Ouais c'est un gâchis ... désolé pour ça ... pendant que j'essaye de le réparer. : p


Je pense que c'est réglé maintenant. @ user123



-1
votes

Veuillez essayer ceci en espérant que cela fonctionne

for ($i = 0; $i < count($array); $i++) {
    if ($array[$i]['value'] == $array[$i+1]['value']) {
        $j = 1;
        while ($array[$i]['value'] == $array[$i+$j+1]['value']) {
            echo $array[$i]['value'].'==='.$array[$i+$j+1]['value'];
            unset($array[$i+$j]);
            $j += 1;
        }
    }
}


0 commentaires

1
votes

Vous pouvez aborder cela comme

$r = [];
$lastKey   = '';
foreach($array as $k => $v){ 
  if(in_array($v['value'], array_column($r, 'value'))){
    $lastKey = $v['key'];
  }else{
    if($lastKey && !in_array($lastKey, array_column($r, 'key'))){
        end($r);
        $r[] = [ 'key' => $lastKey, 'value' => $r[key($r)]['value']];
    }
    $r[]       = [ 'key' => $v['key'] , 'value' => $v['value'] ]; 
    $lastKey     = $v['key'];
  }
}

https://3v4l.org/f6FQv


5 commentaires

Salut, monsieur, ne pouvez-vous pas supprimer la "clé" à l'intérieur du tableau


@ user123 la clé ($ r) obtient la dernière clé du tableau, signifie le dernier tableau d'élément, essayez d'exécuter ce code.


@ user123 se réfère à celui-ci: php.net/manual/en/function.key .php


$ array = [["key" => 0, "value" => 25], ["key" => 2, "value" => 25], ["key" => 3, "value" => 33], ["key" => 4, "value" => 45], ["key" => 5, "value" => 66], ["key" => 8, "value" => 66], ["key" => 9, "value" => 55],]; Je veux dire que la sortie devrait ressembler à ceci..désolé


La solution @ user123 a été mise à jour pour le résultat souhaité.