En utilisant array_filter pour filtrer tableau multidimensionnel

voix
0

J'ai deux tableaux, le second est multidimensionnel. Je suis en train de revenir un troisième tableau où l'host_id en LeTableau2 correspondent aux valeurs Array1.

Array1 
(
    [0] => 146
    [1] => 173
)

Array2
(
    'localhost' => (
        '0' => (
            'host_id' => 146
        ),
    ),
    '192.168.0.43' => (
        '1' => (
            'host_id' => 160
        ),
    ),
    '192.168.0.38' => (
        '2' => (
            'host_id' => 173
        )
    )
)

Alors Array3 devrait être:

    Array3
    (
        [localhost] => Array
            '0' => (
                'host_id' => 146
            ),

        [192.168.0.38] => Array
            '0' => (
                'host_id' => 173
            ),

    )

Je l'ai essayé, mais il est seulement le dernier retour host_id assorti.

foreach ($Array1 as $value) {   

    $filtered_hosts = array_filter($Array2, function ($host) use ($value) {

        return in_array($host['host_id'], $host_id);
    });
}

Qu'est-ce que je rate?

Créé 07/11/2018 à 20:10
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
3

Vous pouvez simplement utiliser array_filter sans foreach.

Passez le premier tableau à use($array1)et utiliser in_array pour vérifier si la valeur de « host_id » existe.

$array1 = [
  146,
  173
];

$array2 = [
    'localhost' => [
        'host_id' => 146
    ],
    '192.168.0.43' => [
        'host_id' => 160
    ],
    '192.168.0.38' => [
        'host_id' => 173
    ]
];

$filtered_hosts = array_filter($array2, function($x) use ($array1) {
    return in_array($x['host_id'], $array1);
});


print_r($filtered_hosts);

Demo

Mettre à jour

Pour la structure de données mise à jour , vous pouvez obtenir le premier élément de la sous - tableau avec par exemple remis à zéro :

$filtered_hosts = array_filter($array2, function ($x) use ($array1) {
    return in_array(reset($x)['host_id'], $array1);
});

Demo

Créé 07/11/2018 à 20:17
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more