2017-09-13 17 views
1

このXMLファイルがあります。foreachを使用して配列内のデータを取得

<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>のデータが2つある場合、スクリプトは両方の詳細を返します。しかし、私が1を取り除くまで、<shop>スクリプトはエラーを返します。不正な文字列オフセット。おそらく配列が正しくないためです。

私は結果を見ることができるようにエコーを介して配列を表示しようとしましたが、削除することもできます。

これは、xmlファイルに2がある場合はprint_r($ shops)の結果です。<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 
           ) 

         ) 

       ) 

     ) 

) 

xmlファイルは一つだけ<shop>を持っている場合、これがしますprint_r($店舗)に対する結果です。

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 21 



Warning: Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22 



Warning: Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23 



Warning: 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 = K 



Warning: Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21 



Warning: Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22 



Warning: Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23 



Warning: 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 = 1 



Warning: Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21 



Warning: Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22 



Warning: Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23 



Warning: 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 21 



Notice: Undefined index: entryname in C:\xampp\htdocs\demo\demoout.php on line 22 



Notice: Undefined index: priority in C:\xampp\htdocs\demo\demoout.php on line 23 



Notice: 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 21 



Warning: Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22 



Warning: Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23 



Warning: 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 = 0 



Warning: Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21 



Warning: Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22 



Warning: Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23 



Warning: 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 21 



Warning: Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22 



Warning: Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23 



Warning: 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 = 1 



Warning: Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21 



Warning: Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22 



Warning: Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23 



Warning: 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 = 5 



Notice: Undefined index: id in C:\xampp\htdocs\demo\demoout.php on line 21 



Notice: Undefined index: entryname in C:\xampp\htdocs\demo\demoout.php on line 22 



Notice: Undefined index: priority in C:\xampp\htdocs\demo\demoout.php on line 23 



Notice: 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 21 



Notice: Undefined index: entryname in C:\xampp\htdocs\demo\demoout.php on line 22 



Notice: Undefined index: priority in C:\xampp\htdocs\demo\demoout.php on line 23 



Notice: 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 21 



Warning: Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22 



Warning: Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23 



Warning: 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 = 0 



Warning: Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21 



Warning: Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22 



Warning: Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23 



Warning: 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 = 1 



Warning: Illegal string offset 'id' in C:\xampp\htdocs\demo\demoout.php on line 21 



Warning: Illegal string offset 'entryname' in C:\xampp\htdocs\demo\demoout.php on line 22 



Warning: Illegal string offset 'priority' in C:\xampp\htdocs\demo\demoout.php on line 23 



Warning: 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 
+0

完全なエラーメッセージを表示して、それが指しているコード行を暗示します(ファイル名と行番号にはアクセスできません) – Calimero

+0

@AlivetoDie申し訳ありませんが、$ limitは余計なパラメータです。無駄です。内容を編集しました。私も完全なエラーを追加しました。 –

+0

@Calimero結果を追加しました。もう一度確認してください –

答えて

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 />'; 
     } 
    } 
} 

参考: - あなたは、配列をチェックする必要がChecking if array is multidimensional or not?

+0

はい、それは正しいです、私は店の2つ以上のカウントがあるかどうかを確認する必要があります。 –

+0

ありがとうございます!私はあなたの訂正でスクリプトを再実行しようとします。 –

+0

@ JohnDaleOcayaAndilDaleあなたが編集した回答を確認してください(不必要な変数の作成を削除しました)。 –

2

は、単一のディメンションまたは複数のディメンションは、あなたの正しいコードは

です
<?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 />'; 
    } 
} 
?> 
+0

エラーからエスケープすることはまったく正しくありません。エスケープしないでください。見つけて解決してください。 –

+1

http://php.net/manual/en/language.operators.errorcontrol.php – sadakat

+1

'その式によって生成される可能性のあるエラーメッセージは無視されます.'->なぜそれを解決できたら無視しますか?だからあなたはいつも予告を残しました、それは警告ですか? –

関連する問題