3
votes

Vérifiez si la valeur d'une clé dans un tableau est égale à la valeur d'une clé différente dans un autre tableau

J'ai 2 tableaux multidimensionnels et je veux obtenir le premier tableau où la valeur de la clé [file] dans le tableau 1 est égale à la valeur de la clé [nom_dossier] dans le tableau 2

$arr1 = [
    [
        'is_dir'      => '1',
        'file'        => 'hello member',
        'file_lcase'  => 'hello member',
        'date'        => '1550733362',
        'size'        => '0',
        'permissions' => '',
        'extension'   => 'dir',
    ],
    [
        'is_dir'      => '1',
        'file'        => 'in in test',
        'file_lcase'  => 'in in test',
        'date'        => '1550730845',
        'size'        => '0',
        'permissions' => '',
        'extension'   => 'dir',
    ]
];

$arr2 = [
    [
        'dic_id'      => '64',
        'folder_name' => 'hello member',
        'share_with'  => '11',
    ],
    [
        'dic_id'      => '65',
        'folder_name' => 'hello inside',
        'share_with'  => '11',
    ],
    [
        'dic_id'      => '66',
        'folder_name' => 'in in test',
        'share_with'  => '11',
    ],
];

J'ai essayé en bouclant 2 tableaux et en accédant à un tableau, mais ce n'est pas un succès.


6 commentaires

À quoi devrait ressembler le résultat?


@sampath donnant votre réponse attendue pour aider à peindre une meilleure image


@hazelcodes Je m'attendais au même tableau que array1.


@sampathwijesinghe Veuillez vérifier ma réponse ci-dessous


@sampathwijesinghe "Je m'attendais au même tableau que array1" n'a pas beaucoup de sens, car si c'est le cas, vous pouvez simplement utiliser array1. Veuillez préciser.


Confirmez que vous souhaitez conserver tous les tableaux du tableau1 qui ont un 'fichier' qui peut être trouvé en tant que 'nom_dossier' dans le tableau 2


3 Réponses :


3
votes

Nous pouvons parcourir les deux tableaux l'un dans l'autre pour vérifier jusqu'à ce que nous ayons une correspondance.

Veuillez noter que cela n'affiche que la première correspondance. Si vous souhaitez conserver toutes les correspondances, vous devez utiliser un autre tableau d'assistance pour stocker les premières valeurs de tableau qui correspondent au deuxième tableau.

foreach ($array1 as $key => $value) {
    foreach ($array2 as $id => $item) {
        if($value['file'] == $item['folder_name']){
            // we have a match so we print out the first array element
            print_r($array1[$key]);
            break;
        }
    }
}


0 commentaires

1
votes
$arr1 = array();
$arr2 = array();
$arr3 = array();
$arr1[] = array('is_dir'=>'1','file'=>'hello member','file_lcase'=>'hello member','date'=>'1550733362','size'=>'0','permissions'=>'','extension'=>'dir');
$arr1[] = array('is_dir'=>'1','file'=>'in in test','file_lcase'=>'in in test','date'=>'1550730845','size'=>'0','permissions'=>'','extension'=>'dir');
$arr2[] = array('dic_id'=>'64','folder_name'=>'hello member','share_with'=>'11');
$arr2[] = array('dic_id'=>'65','folder_name'=>'hello member','share_with'=>'11');
$arr2[] = array('dic_id'=>'66','folder_name'=>'in in test','share_with'=>'11');

foreach($arr1 as $a){
    foreach($arr2 as $a2){
        if($a['file'] == $a2['folder_name']){
            $arr3[]=$a;
        }
    }
}
$arr3 = array_map("unserialize", array_unique(array_map("serialize", $arr3))); // remove duplicates
var_dump($arr3);
$arr3 contains the resultant array.

0 commentaires

3
votes

Pour éviter une double boucle qui donne une complexité temporelle de O (n²) , vous pouvez d'abord créer l'ensemble de valeurs "nom_dossier" (sous forme de clés), puis l'utiliser pour filtrer la première tableau. Ces deux opérations ont une complexité temporelle de O (n) qui est certainement plus efficace pour des tableaux plus grands:

$result = [];
$set = array_flip(array_column($arr2, "folder_name"));
foreach ($arr1 as $elem) {
    if (isset($set[$elem["file"]])) $result[] = $elem;
}

$ result aura les éléments de $ arr1 qui répondent à l'exigence.


0 commentaires