/**
* It plucks parts of columns for each item in array, possibly indexed by a custom column.
*
* @param array $input
* @param ?array $column_keys default null
* @param string $index_key default null
* @return array
*/
function array_columns(array &$input, ?array $column_keys = null, $index_key = null)
{
if (empty($input)) {
return [];
}
if (empty($column_keys) && !isset($index_key)) {
return $input;
}
if (empty($column_keys)) {
return array_combine(
array_column($input, $index_key),
array_values($input)
);
}
$cols = array_flip($column_keys);
$item_type = is_array($input[0]) ? 'array' : (
is_object($input[0]) ? 'object' : null
);
$vals = array_map(function($item) use($cols, $item_type){
$new = null;
// $item_type = gettype($item);
if ($item_type == 'array') {
$new = array_filter($item, function($key) use($cols){
return isset($cols[$key]);
}, ARRAY_FILTER_USE_KEY);
}
if ($item_type == 'object') {
$new = new \stdClass();
foreach ($item as $attr => $value) {
if (isset($cols[$attr])) {
$new->$attr = $value;
}
}
}
return $new;
}, $input);
if (!isset($index_key)) {
return $vals;
}
$keys = array_column($input, $index_key);
return array_combine($keys, $vals);
}
$arr = array(
array('id'=>1001, 'name'=>'carter', 'age'=>40, 'profession'=>'dvlp'),
array('id'=>1002, 'name'=>'hedy', 'age'=>23, 'profession'=>'qa'),
array('id'=>1003, 'name'=>'nora', 'age'=>30, 'profession'=>'qa'),
);
$arr = array_map(function($item){return (object)$item;}, $arr);
var_dump(array_columns($arr, ['name', 'profession']));
var_dump(array_columns($arr, ['name', 'profession'], 'age'));