2016-10-26 8 views
0

PHPで2つの配列の値を比較できない理由を理解しようとしています。ループ中に "echo $ description-> ItemDesriptionName;"を使用してこれらの両方をエコーし​​た場合と "エコー$ item-> ItemName;"値は同じように見えるようですが、ifを使って比較しようとすると、何も動作しません。私は何が欠けていますか?ここでPHP配列の比較を使用する場合

<?php 

$xml=simplexml_load_file("test.xml") or die("Error: Cannot create object"); 
$categories = $xml->Menu->Categories; 
$items = $xml->Menu->Categories->Items->ItemObject; 
$itemdescription = $xml->Menu->Options->Description->DescriptionObject; 

foreach($items as $item) { 

    echo $item->ItemName . ' - ' . $item->Price . '</br>'; 

     foreach ($itemdescription as $description) { 

      if ($description->ItemDescriptionName == $item->ItemName) { 
       echo 'We have a match!'; 
       //where I would echo $description->ItemDescription; 
      } 
     } 
} 

?> 

は、XMLファイルには、

<?xml version="1.0" encoding="utf-8"?> 
<Root> 
    <Menu> 
     <Categories> 
      <Name>Category 1</Name> 
      <Items> 
       <ItemObject> 
        <ItemName>Item 1</ItemName> 
        <Price>1</Price> 
       </ItemObject> 
       <ItemObject> 
        <ItemName>Item 2</ItemName> 
        <Price>3</Price> 
       </ItemObject>    
      </Items> 
     </Categories> 
     <Options> 
      <Description> 
       <DescriptionObject> 
        <ItemDescriptionName>Item 1</ItemDescriptionName> 
        <ItemDescription>A Great item</ItemDescription> 
       </DescriptionObject> 
       <DescriptionObject> 
        <ItemDescriptionName>Item 2</ItemDescriptionName> 
        <ItemDescription>A Great item as well</ItemDescription> 
       </DescriptionObject>     
      </Description> 
     </Options> 
    </Menu> 
</Root> 
+0

ここにはタイプミスがあります。あなたのソースにもタイプミスがありますか? ItemDescriptionNameプロパティの説明に 'n'がありません – Graeme

+0

ソースは表示されませんでしたが、それでも機能しません。ありがとう – Giovanni

答えて

2

は、文字列 として比較し、あなたがItemDescriptioNameのタイプミス(ItemDescriptio N名)

if ((string)$description->ItemDescriptionName == (string)$item->ItemName) { 
+0

もちろん...そのような単純です。ありがとうございました。 – Giovanni

0

であるあなたは、代わりに、直接accordantインデックスを使用してそれらにアクセスすることはできますか?

...

$items = $xml->Menu->Categories->Items->ItemObject; 
$itemdescription = $xml->Menu->Options->Description; 

$i = 0; 
foreach ($items as $item) { 
    echo $i.' '.$item->ItemName . ' - ' . $item->Price; 
    echo $itemdescription->DescriptionObject[$i]->ItemDescriptionName[0]; 
    echo ' '; 
    echo $itemdescription->DescriptionObject[$i]->ItemDescription[0]; 
    echo '</br>'; 
    $i++; 
} 
1

を持つ文字列に変換した後、

<?php 
$xml=simplexml_load_file("test.xml") or die("Error: Cannot create object"); 
$menu = $xml->Menu; 
$categories = $xml->Menu->Categories; 
$items = $xml->Menu->Categories->Items->ItemObject; 
$itemdescription = $xml->Menu->Options->Description->DescriptionObject; 
foreach($items as $item) { 


     $itemname = $item->ItemName; 
     foreach ($itemdescription as $description) { 
      $descriptionname = $description->ItemDescriptionName ; 
      echo $itemname." ---- ".$descriptionname."<br/>"; 

      if((string)$itemname === (string)$descriptionname){ 
       echo "Yes its matched"; 
      } 
     } 
} 

?> 
を比較

私のためにうまく働く

1

$description->ItemDescriptionNameのような特性は、SimpleXMLElementのオブジェクトです。だから、文字列を比較するのではなく、2つのオブジェクトを比較します。

SimpleXMLElementオブジェクトは、マジックメソッド__toString()を実装します。それらは自動的に文字列にキャストできますが、オブジェクトとの比較によってトリガーされません。あなたはそれを強制することができます:

if ((string)$description->ItemDescriptionName === (string)$item->ItemName) { 
    ... 
関連する問題