Получение данных в массиве с использованием foreach

Итак, у меня есть этот XML-файл;

<Response type="1">
<ack>
<ackstatus>OK</ackstatus>
<ackreason></ackreason>
</ack>
<dataversion>1</dataversion>
<hitcount>13391</hitcount>
<shops>
<spad>
</spad>
<basead>
<shop>
<id>KN0100060500216636</id>
<priority>1</priority>
<entryname>旭川職業能力開発促進センター</entryname>
<telno>0166-48-2412</telno>
<zipcode>079-8418</zipcode>
<address>北海道旭川市永山8条20丁目3−1</address>
<latitude>157707796</latitude>
<longitude>512803967</longitude>
<imageurl></imageurl>
<promoword></promoword>
<coupon>0</coupon>
<group>0</group>
<searchnum>7215270</searchnum>
</shop>
<shop>
<id>KN0100060500202256</id>
<priority>1</priority>
<entryname>旭川市立/嵐山小中学校</entryname>
<telno>0166-61-1199</telno>
<zipcode>070-8051</zipcode>
<address>北海道旭川市江丹別町嵐山143</address>
<latitude>157704475</latitude>
<longitude>512195888</longitude>
<imageurl></imageurl>
<promoword></promoword>
<coupon>0</coupon>
<group>0</group>
<searchnum>7215270</searchnum>
</shop>
</basead>
</shops>
</Response>

У меня есть функция, которая анализирует файл XML в массив;

<?php

$xml = simplexml_load_file('hascompany.xml');
$json = json_encode($xml);
$shops = json_decode($json, true);

echo "<pre>";
print_r($shops);
echo "</br></br>";
print_r(count($shops['shops']['basead']['shop']));
echo "</br>";
print_r(count($shops['shops']['basead']));
echo "</br></br>";

logCompanyData( $shops );

function logCompanyData( $shops )
{
foreach ( $shops['shops']['basead']['shop'] as $company )
{
$companyId = $company['id'];
$entryName = $company['entryname'];
$priority  = $company['priority'];
$searchNum = $company['searchnum'];

echo 'company_id = ' . $companyId . '<br />';
echo 'company_name = ' . $entryName . '<br />';
echo 'company_prio = ' . $priority . '<br />';
echo 'company_searchno = ' . $searchNum . '<br /><br />';
}
}

?>

Когда есть два <shop> данные, скрипт возвращает детали для обоих. Но пока я не уберу 1 <shop> скрипт выдает ошибку, недопустимое смещение строки .. вероятно, из-за неправильного массива.

Я попытался отобразить массив с помощью echo, чтобы вы могли видеть результаты, вы также можете попробовать удалить 1.

Это результат для print_r ($ shops), если файл xml имеет 2 <shop>;

Array
(
[@attributes] => Array
(
[type] => 1
)

[ack] => Array
(
[ackstatus] => OK
[ackreason] => Array
(
)

)

[dataversion] => 1
[hitcount] => 13391
[shops] => Array
(
[spad] => Array
(
[0] =>

)

[basead] => Array
(
[shop] => Array
(
[0] => Array
(
[id] => KN0100060500206405
[priority] => 1
[entryname] => 旭川市立/台場小学校
[telno] => Array
(
)

[zipcode] => 070-8022
[address] => 北海道旭川市神居町台場274
[latitude] => 157575990
[longitude] => 512224612
[imageurl] => Array
(
)

[promoword] => Array
(
)

[coupon] => 0
[group] => 1
[searchnum] => 7211472
)

[1] => Array
(
[id] => KN0100060500216326
[priority] => 1
[entryname] => 旭川市立/永山小学校
[telno] => Array
(
)

[zipcode] => 079-8415
[address] => 北海道旭川市永山5条18丁目2−1
[latitude] => 157707415
[longitude] => 512772640
[imageurl] => Array
(
)

[promoword] => Array
(
)

[coupon] => 0
[group] => 1
[searchnum] => 7211472
)

)

)

)

)

Это результат для print_r ($ shops), если в XML-файле есть только один <shop>;

Array
(
[@attributes] => Array
(
[type] => 1
)

[ack] => Array
(
[ackstatus] => OK
[ackreason] => Array
(
)

)

[dataversion] => 1
[hitcount] => 13391
[shops] => Array
(
[spad] => Array
(
[0] =>

)

[basead] => Array
(
[shop] => Array
(
[id] => KN0100060500206405
[priority] => 1
[entryname] => 旭川市立/台場小学校
[telno] => Array
(
)

[zipcode] => 070-8022
[address] => 北海道旭川市神居町台場274
[latitude] => 157575990
[longitude] => 512224612
[imageurl] => Array
(
)

[promoword] => Array
(
)

[coupon] => 0
[group] => 1
[searchnum] => 7211472
)

)

)

)

Это полная ошибка, если XML-файл имеет только один <shop>:

Warning:  Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21Warning:  Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22Warning:  Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23Warning:  Illegal string offset 'searchnum' in C:\xampp\htdocs\demo\demoout.php on line 24

company_id = K
company_name = K
company_prio = K
company_searchno = KWarning:  Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21Warning:  Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22Warning:  Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23Warning:  Illegal string offset 'searchnum' in C:\xampp\htdocs\demo\demoout.php on line 24

company_id = 1
company_name = 1
company_prio = 1
company_searchno = 1Warning:  Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21Warning:  Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22Warning:  Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23Warning:  Illegal string offset 'searchnum' in C:\xampp\htdocs\demo\demoout.php on line 24

company_id = �
company_name = �
company_prio = �
company_searchno = �Notice:  Undefined index: id in C:\xampp\htdocs\demo\demoout.php on line 21Notice:  Undefined index: entryname in C:\xampp\htdocs\demo\demoout.php on line 22Notice:  Undefined index: priority in C:\xampp\htdocs\demo\demoout.php on line 23Notice:  Undefined index: searchnum in C:\xampp\htdocs\demo\demoout.php on line 24

company_id =
company_name =
company_prio =
company_searchno =Warning:  Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21Warning:  Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22Warning:  Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23Warning:  Illegal string offset 'searchnum' in C:\xampp\htdocs\demo\demoout.php on line 24

company_id = 0
company_name = 0
company_prio = 0
company_searchno = 0Warning:  Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21Warning:  Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22Warning:  Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23Warning:  Illegal string offset 'searchnum' in C:\xampp\htdocs\demo\demoout.php on line 24

company_id = �
company_name = �
company_prio = �
company_searchno = �Warning:  Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21Warning:  Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22Warning:  Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23Warning:  Illegal string offset 'searchnum' in C:\xampp\htdocs\demo\demoout.php on line 24

company_id = 1
company_name = 1
company_prio = 1
company_searchno = 1Warning:  Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21Warning:  Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22Warning:  Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23Warning:  Illegal string offset 'searchnum' in C:\xampp\htdocs\demo\demoout.php on line 24

company_id = 5
company_name = 5
company_prio = 5
company_searchno = 5Notice:  Undefined index: id in C:\xampp\htdocs\demo\demoout.php on line 21Notice:  Undefined index: entryname in C:\xampp\htdocs\demo\demoout.php on line 22Notice:  Undefined index: priority in C:\xampp\htdocs\demo\demoout.php on line 23Notice:  Undefined index: searchnum in C:\xampp\htdocs\demo\demoout.php on line 24

company_id =
company_name =
company_prio =
company_searchno =Notice:  Undefined index: id in C:\xampp\htdocs\demo\demoout.php on line 21Notice:  Undefined index: entryname in C:\xampp\htdocs\demo\demoout.php on line 22Notice:  Undefined index: priority in C:\xampp\htdocs\demo\demoout.php on line 23Notice:  Undefined index: searchnum in C:\xampp\htdocs\demo\demoout.php on line 24

company_id =
company_name =
company_prio =
company_searchno =Warning:  Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21Warning:  Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22Warning:  Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23Warning:  Illegal string offset 'searchnum' in C:\xampp\htdocs\demo\demoout.php on line 24

company_id = 0
company_name = 0
company_prio = 0
company_searchno = 0Warning:  Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21Warning:  Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22Warning:  Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23Warning:  Illegal string offset 'searchnum' in C:\xampp\htdocs\demo\demoout.php on line 24

company_id = 1
company_name = 1
company_prio = 1
company_searchno = 1Warning:  Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21Warning:  Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22Warning:  Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23Warning:  Illegal string offset 'searchnum' in C:\xampp\htdocs\demo\demoout.php on line 24

company_id = 7
company_name = 7
company_prio = 7
company_searchno = 7

1

Решение

Вы должны сначала проверить, что $shops['shops']['basead']['shop'] такое многомерный массив или нет? Если да, то используйте foreach() печатать иначе использовать echo прямо как ниже: —

function logCompanyData( $shops ){

if(count($shops['shops']['basead']['shop']) == count($shops['shops']['basead']['shop'], COUNT_RECURSIVE)){
echo 'company_id = ' . $shops['shops']['basead']['shop']['id'] . '<br />';
echo 'company_name = ' . $shops['shops']['basead']['shop']['entryname'] . '<br />';
echo 'company_prio = ' . $shops['shops']['basead']['shop']['priority'] . '<br />';
echo 'company_searchno = ' . $shops['shops']['basead']['shop']['searchnum'] . '<br /><br />';
}else{

foreach ( $shops['shops']['basead']['shop'] as $company )
{
echo 'company_id = ' . $company['id'] . '<br />';
echo 'company_name = ' . $company['entryname'] . '<br />';
echo 'company_prio = ' . $company['priority'] . '<br />';
echo 'company_searchno = ' . $company['searchnum'] . '<br /><br />';
}
}
}

Ссылка:-Проверка, является ли массив многомерным или нет?

1

Другие решения

вам нужно проверить массив является одномерным или многомерным ваш правильный код

<?php
$xml = simplexml_load_file('shop.xml');
$json = json_encode($xml);
$shops = json_decode($json, true);

echo "<pre>";
print_r($shops);
echo "</br></br>";
print_r(count($shops['shops']['basead']['shop']));
echo "</br>";
print_r(count($shops['shops']['basead']));
echo "</br></br>";

logCompanyData( $shops, $limit=1);

function logCompanyData( $shops, $limit )
{
$array_data = array();
if(is_array(@$shops['shops']['basead']['shop'][0])){
$array_data = $shops['shops']['basead']['shop'];
}else{
$array_data = array($shops['shops']['basead']['shop']);
}
foreach ( $shops['shops']['basead']['shop'] as $company )
{
// /echo "<pre>"; print_r( $company); die();
$companyId = $company['id'];
$entryName = $company['entryname'];
$priority  = $company['priority'];
$searchNum = $company['searchnum'];

echo 'company_id = ' . $companyId . '<br />';
echo 'company_name = ' . $entryName . '<br />';
echo 'company_prio = ' . $priority . '<br />';
echo 'company_searchno = ' . $searchNum . '<br /><br />';
}
}
?>
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector