Создание массива в массиве из foreach в foreach xml значений

#php #arrays #xml #foreach

#php #массивы #xml #foreach

Вопрос:

я потратил 3 дня на поиск Google, и я могу создать массив в массиве из нескольких XML-файлов (у каждого xml есть один день), но этот второй массив имеет три точки вместо значений и много чего перепробовал. Позвольте мне показать вам некоторый код. Один, например. XML-файл:

 <?xml version="1.0" encoding="UTF-8" ?>
<data>
<info>
  <item ID="NAMEOFFILE" DATA="2020-11-02" HOUR="22:01" USER="XXXX" ></item>
</info>
<transaction>
  <item VALUE="5" DESC="User 1"></item>
  <item VALUE="1.22" DESC="User 2"></item>
  <item VALUE="9.37" DESC="User 3"></item>
</transaction>
</data>
 

И php-код:

     $xml  = array();
    foreach ($xml_files as $f) 
    {  
       $content = utf8_encode(file_get_contents($f)); 
       $data = simplexml_load_string($content);
       
       $arrayName = array(); 
       foreach ($data->transaction->item as $values) 
       {  
          //$arrayName[] = trim($values['VALUE']); //this works but i want to add array VALUE with DESC
          $arrayName[] = array('val' => (double)trim($values['VALUE']), 'desc' => trim($values['DESC']));
       }
       $xml[] = array(
          'fileName' => trim($data->info->item['ID']) 
          ,'data' => trim($data->info->item['DATA'])
          ,'hour' => trim($data->info->item['HOUR'])  
          ,'user' => trim($data->info->item['USER'])
          ,'transaction' => $arrayName
                        
       );  
    }
var_dump($xml);
 

Лучшее, чего я достиг, это:

 array (size=16)
  'fileName' => string 'NAMEOFFILE' (length=8)
  'data' => string '2020-12-01' (length=10)
  'hour' => string '13:50' (length=5)
  'user' => string 'XXXXX' (length=16)
  'transaction' => 
    array (size=3)
      0 => 
        array (size=2)
          ...
      1 => 
        array (size=2)
          ...
      2 => 
        array (size=2)
          ...
 

или

 // with $arrayName[] = trim($values['VALUE']);
array (size=16)
  'fileName' => string 'NAMEOFFILE' (length=8)
  'data' => string '2020-12-01' (length=10)
  'hour' => string '13:50' (length=5)
  'user' => string 'XXXXX' (length=16)
  'transaction' => 
    array (size=3)
        array (size=7)
          0 => float 5
          1 => float 1.22
          2 => float 9.37
 

я просто хочу получить этот второй массив как

  0 => 
    array (size=2)
      'VALUE' => float 5
      'DESC' => string 'descripton value 1' (length=30)
  1 => 
    array (size=2)
      'VALUE' => float -2.22
      'DESC' => string 'description value 2' (length=30)
 

я пробовал с array_psuh, merge, add … пытался даже сделать $arrName[][] и другие варианты, пытался поместить все элементы массивов для добавления в каждое место внутри, вытеснить все циклы и т.д. Могу поспорить, что это нелепая ошибка, но когда я искал «создание массива в array php» и тому подобное в Google, они всегда показывают, как читать массивы или создавать простые без какого-либо двойного foreach и т. Д. Кто-нибудь может помочь? ;/

Комментарии:

1. Примечание: вы полностью уверены , что хотите запустить utf8_encode ? Он действительно плохо назван и часто ошибочно принимается за волшебное «исправить все мои проблемы с UTF-8», когда все, что он на самом деле делает, — это преобразование из одной конкретной однобайтовой кодировки («ISO LATIN 1») в UTF-8. Если ваш ввод не в этой конкретной однобайтовой кодировке, все, что он будет делать, это искажать ваши данные.

2. Что касается вашего фактического вопроса, я думаю, что ... это просто результат вашей функции отладки. Несмотря на то, что вы показываете var_dump , ваш вывод не из встроенного var_dump , который будет выглядеть следующим образом: 3v4l.org/nhG7N (обратите внимание, например, на то, как там написано array(2) «нет array (size=2) «).

3. @IMSoP о боже… вы абсолютно правы!! echo '<pre>'; print_r($xml); выполняйте работу … мои 3 дня смешивания кода из-за плохого вывода! Я сделал это правильно в первый раз: D