TransWikia.com

Acceder a arreglos dentro de otros arreglos

Stack Overflow en español Asked by Gerardo Rios on December 2, 2021

necesito acceder al valor almacenado en [01A] como puedo recorrer el arreglo para poder llegar a ese valor? (PHP)

Array
(
    [0] => Array
        (
            [precio] => 500
            [moneda] => USD
            [almacenes] => Array
                (
                    [0] => Array
                        (
                            [01A] => 3
                        )

                )

            [codigo] => ACCACR130
        )

2 Answers

Trata de reconocer cada elemento, de forma que puedas visualizarlo antes de tratar de acceder:

  • $productos es un arreglo donde cada elemento es otro arreglo
  • Cada producto tiene un elemento almacenes con un arreglo de 1 o más elementos
  • Cada almacén es un par de clave => valor, donde realmente sobra el arreglo padre, porque obliga a usar otro ciclo:
$productos = [
   [
      'precio' => '500',
      'moneda' => 'USD',
      'almacenes' => [
          ['01A' => 3],
          ['02B' => 3],
      ],
      'codigo' => 'ACCACR130',
   ],
   [
      'precio' => '750',
      'moneda' => 'MXN',
      'almacenes' => [
          ['01A' => 5],
          ['02B' => 3],
      ],
      'codigo' => 'ACCACR750',
   ],
];

// Recorres el array productos
foreach($productos as $producto) {
    $codigo = $producto['codigo'];
    // Dentro de cada producto, recorres almacenes
    foreach($producto['almacenes'] as $almacen) {
        // Cada almacén es un arreglo con solo un elemento clave => valor
        if(isset($almacen['01A'])) {
            $cantidad = $almacen['01A'];
            echo "<p>$codigo encontrado en 01A con $cantidad</p>";
        }
    }
}

Si puedes simplificar la estructura de almacenes para guardar solo clave y valor por cada almacén, el código se reduce y solo necesitas un ciclo para recorrer productos:

$productos = [
   [
      'precio' => '500',
      'moneda' => 'USD',
      'almacenes' => [
          '01A' => 3,
          '02B' => 3,
      ],
      'codigo' => 'ACCACR130',
   ],
   [
      'precio' => '750',
      'moneda' => 'MXN',
      'almacenes' => [
          '01A' => 5,
          '02B' => 3,
      ],
      'codigo' => 'ACCACR750',
   ],
];

// Recorres el array productos
foreach($productos as $producto) {
    $codigo = $producto['codigo'];
    // Dentro de cada producto, buscas directamente '01A' en almacenes
    if(isset($producto['almacenes']['01A'])) {
        $cantidad = $producto['almacenes']['01A'];
        echo "<p>$codigo encontrado en 01A con $cantidad</p>";
    }
}

Answered by Triby on December 2, 2021

Podrias usar una funcion recursiva, mas o menos asi:

$arreglo = [
   [
      'precio' => '500',
      'moneda' => 'USD',
      'almacenes' => [['01A' => 3]],
      'codigo' => 'ACCACR130',
   ]
];

function search($array, $search)
{
   foreach($array as $key => $value){
      if(is_array($value)){
         search($value,$search);
      }
      elseif($key === $search){
         echo $value;
      }
   }
}
$buscar = "01A";
search($arreglo, $buscar);

Explicacion: A la funcion le pasas dos parametros, el arreglo array y la busqueda search. Primero si la llave key es un arreglo, entonces vuelves a llamar a la funcion que vuelve a ejecutar el foreach dentro de el subarreglo y asi sucesivamente hasta que no encuentre un arreglo. En ese momento, la funcion comparara la llave y si es igual a la busqueda, entonces te imprimira el valor de esa llave $value.

La salida del codigo de arriba es : 3.

Pero nota que si camibas el valor de la variable $buscar a codigo por ejemplo te va a dar el valor de codigo que es ACCACR130.

Nota que esto funciona solamente cuando la busqueda es exactamente igual a la llave y cuando la llave es de tipo string. Si por ejemplo le pones a la busqueda almacenes esto no va a hacer nada por que el valor de almacenes es un arreglo por lo que en teoria esto llamaria otra vez a la funcion misma y nunca seria igual a la busqueda que es de tipo string

Answered by xelfury on December 2, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP