0

私が知る限り、動作するはずのPHP配列に問題があります。私は simpleXML で作業しており、simpleXML 出力をループしています。次に、関連する XML ノードから「id」属性を取得し、それを配列内の新しい項目のキーとして割り当て、その値を国名として割り当てようとしています。これが私の simpleXML 出力のサンプルです ($cxml以下のコード内):

SimpleXMLElement Object ( 
  [country] => Array ( 
    [0] => SimpleXMLElement Object ( 
      [@attributes] => Array ( [id] => AD ) 
      [name] => ANDORRA 
      [ssc] => EUR 
    ) 
    [1] => SimpleXMLElement Object ( 
      [@attributes] => Array ( [id] => AE ) 
      [name] => UNITED ARAB EMIRATES 
      [ssc] => EUR 
    ) 
    [2] => SimpleXMLElement Object ( 
      [@attributes] => Array ( [id] => AF ) 
      [name] => AFGHANISTAN 
      [ssc] => ASI 
    ) ...
  )

など。これが私のコードです:

function generateCountryList() {
  global $server_path;
  // the following line generates - correctly - the object I gave above
  $cxml = simplexml_load_file($server_path . 'countries/');  
  $c = array();
  foreach ($cxml->country as $cntry => $rec) {
    $rid = $rec['id'];
    $rname = ucwords(strtolower($rec->name));
    //the following echo statements are for debugging only
    echo $rid;  //returns the country ID; for example, AD on the 0th element in the object
    echo $rname;  //returns the country name; for example, Andorra on the 0th element in the object
    $c[$rid] = $rname;  //the goal here is to have an array of the form    
                        //['AD'=>'Andorra','AE'=>'United Arab Emirates',...]
 }
return $c;
}

返し$cて変数に代入すると、print_rその変数は空の配列になります。print_r($c);この関数内で実行すると、同じことが得られます。

この配列を構築できない理由について誰かが提供できる助けをいただければ幸いです!

4

1 に答える 1

1

を使用して SimpleXML オブジェクトの子ノードに移動すると、$element->elementName別の SimpleXML オブジェクトが取得されるため、そこから移動を続けることができます。子ノードの文字列コンテンツを取得するには、PHP 文字列キャスト演算子を使用します(string)$element->elementName

あまり明白でないのは、 を使用して attribute に移動すると、別の SimpleXML オブジェクトも得られることです。文字列の内容以外にそのオブジェクトに必要なものはあまりありませんが、たとえば、ループ内で呼び出したい場合があります。繰り返しますが、文字列の内容を取得するには、発見したように を使用する必要があります。$element['attribName']$attrib->getName()(string)$element['attribName']

echo 現在、暗黙的に string にキャストするなど、PHP の一部の関数と構成要素は、それらと一緒に使用する他のデータ型がないためです。ただし、これらがどれであるかを正確に学習してコードを変更するときに混乱を招くのではなく、SimpleXML の結果を常に .xml を使用して明示的に文字列にキャストすることをお勧めし(string)ます。

最後に、 を使用して内容から整数値を取得したり、 を使用(int)して float を取得したりすることもできます(float)。ただし、オブジェクトを合計で使用する$element['attribName'] * 1.0と、関係する値が何であれ、常に整数に変換されます。繰り返しになりますが、明示的なキャストにより、驚きが少なくなります。

于 2013-01-30T18:56:15.897 に答える