Saltar al contenido

PHP: obtenga varias columnas de array

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *