Intenta entender el código bien antes de aplicarlo a tu proyecto y si tquieres aportar algo puedes compartirlo con nosotros.
Solución:
Si necesita dos columnas de un array donde uno es SKU (que generalmente es único), puede usar array_column con el tercer parámetro.
$new = array_column($arr, "product_id", "product_sku");
Esto devolverá un piso array con el SKU como el key e ID como valor haciendo el array fácil de trabajar con también.
Producción:
array(3)
[6500722]=>
string(4) "1138"
[6501046]=>
string(4) "1144"
[6294915]=>
string(3) "113"
https://3v4l.org/UDGiO
Creo que el mayor problema es que pierdes el keys
Código original
array (
0 =>
array (
0 => '1138',
1 => '6500722',
),
1 =>
array (
0 => '1144',
1 => '6501046',
),
2 =>
array (
0 => '113',
1 => '6294915',
);
Puede usar un foreach simple en lugar del segundo 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);
Producción
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',
),
)
Salvadera
el problema es que parece demasiado lento, ya que itera dos veces sobre esto.
No hay una forma real de no iterarlo 2 veces, pero probablemente no quieras tirar el keys cualquiera.
Dicho esto, puede desarmar recursivamente los elementos que no desea.
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);
Misma salida que antes
Esto es más fácil de hacer por referencia. Mas bien o no que sea mas rapido tendras que probar los 2 y ver.
Salvadera
Como nota final, no debe asumir la key existirá o eso keys será un array a menos que lo escriba como un array.
También podrías hacerlo con array filtrar
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);
Hay un pequeño beneficio de rendimiento al declarar la función para filtrar fuera del ciclo (array_map).
Salvadera
Si no desea cambiar su original array y quiere su resultado deseado
Use la función array_insersect_key para obtener el resultado deseado de la siguiente manera
$array = array(
[
"product_id" => "1138",
"product_image" => "/resources/medias/shop/products/shop-6500720--1.png",
"product_sku" => "6500722"
],
[
"product_id" => "1144",
"product_image" => "/resources/medias/shop/products/shop-6501041--1.png",
"product_sku" => "6501046"
],
[
"product_id" => "113",
"product_image" => "/resources/medias/shop/products/shop-6294909--1.png",
"product_sku" => "6294915"
]
);
$keys = array("product_id"=>1, "product_sku"=>2);
$filteredArray = array_map(function($a) use($keys)
return array_intersect_key($a,$keys);
, $array);
print_r($filteredArray);
Si conservas alguna perplejidad o capacidad de refinar nuestro ensayo eres capaz de escribir una crónica y con gusto lo observaremos.