Home > Software design >  arrays with dif keys inside 1 array
arrays with dif keys inside 1 array

Time:10-07

like the question says, I have 2 foreach cycles, 1 cycle iterates an array with 4 keys, and the other one an array with 3 keys, how to get this two arrays in only 1 ?

I have this

                ....
               ],
            ],
            'Detalle' => array()
    ];

  foreach ($datos["line_items"] as $line => $item) {  
    $tempArray = array(     
      'NmbItem' => $item['name'],
      'QtyItem' => $item['quantity'],   
      'PrcItem' => $item['price'],
      'IndExe' => 1
    );   
  }

  foreach($datos["fee_lines"] as $line => $fee){
    $tempArray=array(     
      'NmbItem' => $fee['name'],
      'QtyItem' => 1,
      'PrcItem' => $fee['total']
    );
  }  

  $dte['Detalle'][] = $tempArray; 
}

if you notice the second array cycle doesnt contain 'indexe' key, after asign this tempArray in $dte['Detalle'][] = $tempArray only works with the last cycle, or the first one if I remove the second.

the output should be something like:

tempArray (array[0] 'NmbItem => name','QtyItem'=> 10,'PrcItem'= 1000,'IndExe' => 1 array[1] 'NmbItem => another name','QtyItem'=> 5,'PrcItem'=> 3000 )

thx you !

CodePudding user response:

Like this ?

$tempArray = [];
foreach ($datos["line_items"] as $line => $item) {  
    $tempArray[$line][] = array(     
      'NmbItem' => $item['name'],
      'QtyItem' => $item['quantity'],   
      'PrcItem' => $item['price'],
      'IndExe' => 1
    );   
  }

  foreach($datos["fee_lines"] as $line => $fee){
    $tempArray[$line][] =array(     
      'NmbItem' => $fee['name'],
      'QtyItem' => 1,
      'PrcItem' => $fee['total']
    );
  }  

$dte['Detalle'][] = $tempArray; 

CodePudding user response:

To make it work with your code, you should also add $dte['Detalle'][] = $tempArray; after the first loop.

The issue is that you are setting the $tempArray in each foreach so you end up with only the last one when assigning it in the $dte['Detalle'].

So, something like this should work:

foreach ($datos["line_items"] as $line => $item) {  
    $tempArray = array(     
      'NmbItem' => $item['name'],
      'QtyItem' => $item['quantity'],   
      'PrcItem' => $item['price'],
      'IndExe' => 1
    );   
 }

 $dte['Detalle'][] = $tempArray; 

 foreach($datos["fee_lines"] as $line => $fee){
    $tempArray=array(     
      'NmbItem' => $fee['name'],
      'QtyItem' => 1,
      'PrcItem' => $fee['total']
    );
 }  

 $dte['Detalle'][] = $tempArray; 

However, I would do it using the array_map function.

Docs for array_map

You can have it something like this:

<?php

$data_1 = array_map(function($item){
    return array(     
      'NmbItem' => $item['name'],
      'QtyItem' => $item['quantity'],   
      'PrcItem' => $item['price'],
      'IndExe' => 1
    );
}, $datos["line_items"]);

$data_2 = array_map(function($fee){
    return array(     
      'NmbItem' => $fee['name'],
      'QtyItem' => 1,
      'PrcItem' => $fee['total']
    )
}, $datos["fee_lines"]);

$dte['Detalle'] = array_merge($dte['Detalle'], $data_1, $data_2);
  • Related