#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