Извлечение или фильтрация специфических ключей и значений многомерного массива в другой - PullRequest
0 голосов
/ 07 марта 2019

Я хочу отфильтровать или сохранить выбранные ключи и их значения в многомерном массиве. Я пробовал несколько методов с array_columns, array_filter и т. Д. ... но я не могу сохранить первоначальную структуру моего массива.

вот оригинальный пример:

Array
(
    [0] => Object
        (
            [not_wanted_key1] => some value
            [wanted_key1] => wanted value
            [wanted_key2] => wanted value
            [not_wanted_key3] => some value
            [wanted_key3] => wanted value



       )

    [1] => Object
        (
            [not_wanted_key1] => some value
            [wanted_key1] => wanted value
            [wanted_key2] => wanted value
            [not_wanted_key3] => some value
            [wanted_key3] => wanted value
        )
)

ожидаемый результат:

Array
(
    [0] => Object
        (
            [wanted_key1] => wanted value
            [wanted_key2] => wanted value
            [wanted_key3] => wanted value
       )

    [1] => Object
        (
            [wanted_key1] => wanted value
            [wanted_key2] => wanted value
            [wanted_key3] => wanted value
        )
)

Кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 07 марта 2019

Вы можете сделать это так:

//test data
$array[] = new stdClass;
$array[0]->not_wanted_key1 = '1';
$array[0]->not_wanted_key2 = '3';
$array[0]->wanted_key1 = '4';
$array[0]->wanted_key2 = '5';
$array[0]->wanted_key3 = '6';

print_r($array);


$map = array_flip(['wanted_key1', 'wanted_key2', 'wanted_key3']);

$res = array_map(function($item) use ($map){
    return array_intersect_key((array) $item, $map);
}, $array);


print_r($res);

выход

//input array
Array
(
    [0] => stdClass Object
        (
            [not_wanted_key1] => 1
            [not_wanted_key2] => 3
            [wanted_key1] => 4
            [wanted_key2] => 5
            [wanted_key3] => 6
        )

)
//output array
Array
(
    [0] => Array
        (
            [wanted_key1] => 4
            [wanted_key2] => 5
            [wanted_key3] => 6
        )

)

Песочница

Довольно просто, уловка (array) приведение объекта к массиву, а затем мне нравится использовать array_intersect_key, но мне лень вручную $map делать, поэтому я просто переворачиваю значения, чтобы быть ключами ,

Таким образом, вы можете легко добавлять / удалять ключи, которые хотите сохранить, просто добавляя / удаляя их из $map.

Если вы хотите сохранить внутренний массив как объект, вы также можете привести его обратно! так что измени это:

 return array_intersect_key((array) $item, $map);

К

 return (object)array_intersect_key((array) $item, $map);

выход

Array
(
    [0] => stdClass Object
        (
            [wanted_key1] => 4
            [wanted_key2] => 5
            [wanted_key3] => 6
        )
)

Песочница

Для ясности все, что вам нужно, это остальное для тестирования:

$map = array_flip(['wanted_key1', 'wanted_key2', 'wanted_key3']);
$res = array_map(function($item)use($map){return array_intersect_key((array)$item,$map);},$array);
0 голосов
/ 07 марта 2019

Аналогично ответу ArtisticPheonix, переберите и сохраните нужные нам ключи, используя пересечение:

<?php

$data =
[
    ['fruit'=>'apple',  'veg'=>'carrot'],
    ['fruit'=>'banana', 'veg'=>'marrow']
];

$flipped_wanted_keys = array_flip(['fruit']);
foreach($data as &$item)
    $item = array_intersect_key($item, $flipped_wanted_keys);

unset($item);
print_r($data);

Вывод:

Array
(
    [0] => Array
        (
            [fruit] => apple
        )

    [1] => Array
        (
            [fruit] => banana
        )

)

Поскольку у вас есть объекты в массиве, удалениеСвойства требуют другого подхода, но если вы счастливы иметь многомерный массив, как указано выше, в качестве вывода, то вам просто нужно привести ваш объект к массиву до пересечения ключей (при условии, что это доступные свойства).

$item = array_intersect_key((array) $item, $flipped_wanted_keys);
0 голосов
/ 07 марта 2019

array_filter() должны выполнить работу.

Простой пример:

$original = ['a' => 2, 'b' => 5, 'c' => 6];

$filtered = array_filter($original, function($item) {
    // This anonymous function must return true for keeping your item, or false for not keeping it

    // There I want to keep items with a value more than 4.
    return ($item > 4);
});

// Output of $filtered: ['b' => 5, 'c' => 6]

Тот же пример с массивом объектов, предполагая, что они имеют valueсвойство:

$filtered = array_filter($original, function($item) {
    // There I want to keep items with a value more than 4.
    return ($item->value > 4);
});

// Output of $filtered: ['b' => 5, 'c' => 6]

Если ваша логика заключается в фильтрации по ключам, третий параметр flag должен быть установлен на ARRAY_FILTER_USE_KEY.Тогда $item будут вашими ключами, а не значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...