I have an array:
JavaScript
x
[
(int) 0 => object(stdClass) {
key1 => 'aaa'
key2 => 'bbb'
key3 => 'ccc'
},
(int) 1 => object(stdClass) {
key1 => 'ddd'
key2 => 'eee'
key3 => 'fff'
},
(int) 2 => object(stdClass) {
key1 => 'ggg'
key2 => 'hhh'
key3 => 'iii'
}
]
I want to return a json_encode for this array, but only for “key2” and “key3” attributes.
For the moment that:
JavaScript
foreach($myArray as $key){
unset($key->key1);
}
But this is not okay as the array may also contain other properties. If it is possible, I prefer not to use loops…
(sorry for my english)
Advertisement
Answer
This solution uses array_map()
and array_intersect_key()
:
JavaScript
<?php
$data = [
['key1' => 'aaa', 'key2' => 'bbb', 'key3' => 'ccc'],
['key1' => 'ddd', 'key2' => 'eee', 'key3' => 'fff'],
['key1' => 'ggg', 'key2' => 'hhh', 'key3' => 'iii']
];
/**
* define allowed keys
*
* array_flip() exchanges the keys with their values
* so it becomes ['key2' => 0, 'key3' => 1]
* useful for array_intersect_key() later on
*
*/
$allowed = array_flip(['key2', 'key3']);
$newData = array_map(
function($item) use ($allowed) {
return array_intersect_key($item, $allowed);
},
$data
);
echo json_encode($newData);
…which prints:
JavaScript
[{"key2":"bbb","key3":"ccc"},{"key2":"eee","key3":"fff"},{"key2":"hhh","key3":"iii"}]