Я думаю, что большая проблема в том, что вы теряете ключи
Оригинальный код
array (
0 =>
array (
0 => '1138',
1 => '6500722',
),
1 =>
array (
0 => '1144',
1 => '6501046',
),
2 =>
array (
0 => '113',
1 => '6294915',
);
Вы можете использовать простой foreach вместо второй карты array_map:
function colsFromArray(array $array, $keys)
{
if (!is_array($keys)) $keys = [$keys];
return array_map(function ($el) use ($keys) {
$o = [];
foreach($keys as $key){
// if(isset($el[$key]))$o[$key] = $el[$key]; //you can do it this way if you don't want to set a default for missing keys.
$o[$key] = isset($el[$key])?$el[$key]:false;
}
return $o;
}, $array);
}
Вывод
array (
0 =>
array (
'product_id' => '1138',
'product_sku' => '6500722',
),
1 =>
array (
'product_id' => '1144',
'product_sku' => '6501046',
),
2 =>
array (
'product_id' => '113',
'product_sku' => '6294915',
),
)
Песочница
проблема в том, что она кажется слишком запаздывающей, так как она повторяется дважды по этому.
Нет реального способа не повторять его 2 раза, но вы, вероятно, тоже не хотите выбрасывать ключи.
При этом вы можете рекурсивно сбросить элементы, которые выне хочу.
function colsFromArray(array &$array, $keys)
{
if (!is_array($keys)) $keys = [$keys];
foreach ($array as $key => &$value) {
if (is_array($value)) {
colsFromArray($value, $keys); //recursive
}else if(!in_array($key, $keys)){
unset($array[$key]);
}
}
}
colsFromArray($array, array("product_id", "product_sku"));
var_export($array);
Тот же вывод, что и раньше
Это проще сделать по ссылке.Скорее, быстрее, вам придется проверить 2 и посмотреть.
Песочница
В качестве последнего замечания вы не должны предполагать, что ключ будет существовать илиэти ключи будут массивом, если вы не введете его как массив.
Вы также можете сделать это с фильтром массива
function colsFromArray(array $array, $keys)
{
if (!is_array($keys)) $keys = [$keys];
$filter = function($k) use ($keys){
return in_array($k,$keys);
};
return array_map(function ($el) use ($keys,$filter) {
return array_filter($el, $filter, ARRAY_FILTER_USE_KEY );
}, $array);
}
Существует небольшое преимущество в производительности для объявления функции фильтрациивне цикла (array_map).
Песочница