通过 PHP 评估 SimpleXMLElement

Evaluate SimpleXMLElement through PHP

如果我打印出以下内容

$oXML = new \SimpleXMLElement($jobs);

我得到这样的数据

object(SimpleXMLElement)#359 (1) {
  ["Job"]=>
  array(4) {
    [0]=>
    object(SimpleXMLElement)#360 (10) {
      ["ID"]=>
      string(7) "J000001"
      ["Name"]=>
      string(13) "Internal Time"
      ["Description"]=>
      string(152) "Use this job to record your internal and non-billable time for activities such as annual leave, sick leave, professional development, staff meetings etc"
      ["Client"]=>
      object(SimpleXMLElement)#366 (2) {
        ["ID"]=>
        string(7) "8430219"
        ["Name"]=>
        string(11) "Fake Client"
      }
      ["ClientOrderNumber"]=>
      object(SimpleXMLElement)#367 (0) {
      }
      ["State"]=>
      string(7) "Planned"
      ["StartDate"]=>
      string(19) "2016-03-21T00:00:00"
      ["DueDate"]=>
      string(19) "2017-03-21T00:00:00"
      ["InternalID"]=>
      string(8) "11442733"
      ["Assigned"]=>
      object(SimpleXMLElement)#368 (1) {
        ["Staff"]=>
        object(SimpleXMLElement)#369 (2) {
          ["ID"]=>
          string(6) "344460"
          ["Name"]=>
          string(10) "Some Name"
        }
      }
    }
    [1]=>
    object(SimpleXMLElement)#361 (10) {
      ["ID"]=>
      string(7) "J000002"
      ["Name"]=>
      string(26) "Setup and Conversion Steps"
      ["Description"]=>
      object(SimpleXMLElement)#368 (0) {
      }
      ["Client"]=>
      object(SimpleXMLElement)#367 (2) {
        ["ID"]=>
        string(7) "8550368"
        ["Name"]=>
        string(4) "Some Client"
      }
      ["ClientOrderNumber"]=>
      object(SimpleXMLElement)#366 (0) {
      }
      ["State"]=>
      string(7) "Planned"
      ["StartDate"]=>
      string(19) "2016-03-24T00:00:00"
      ["DueDate"]=>
      string(19) "2016-04-07T00:00:00"
      ["InternalID"]=>
      string(8) "11442734"
      ["Assigned"]=>
      object(SimpleXMLElement)#369 (1) {
        ["Staff"]=>
        object(SimpleXMLElement)#370 (2) {
          ["ID"]=>
          string(6) "344460"
          ["Name"]=>
          string(10) "John Doe"
        }
      }
    }
    [2]=>
    object(SimpleXMLElement)#362 (10) {
      ["ID"]=>
      string(7) "J000004"
      ["Name"]=>
      string(9) "retertret"
      ["Description"]=>
      object(SimpleXMLElement)#369 (0) {
      }
      ["Client"]=>
      object(SimpleXMLElement)#366 (2) {
        ["ID"]=>
        string(7) "8430219"
        ["Name"]=>
        string(11) "Fake Client"
      }
      ["ClientOrderNumber"]=>
      object(SimpleXMLElement)#367 (0) {
      }
      ["State"]=>
      string(7) "Planned"
      ["StartDate"]=>
      string(19) "2016-04-01T00:00:00"
      ["DueDate"]=>
      string(19) "2016-04-01T00:00:00"
      ["InternalID"]=>
      string(8) "11612898"
      ["Assigned"]=>
      object(SimpleXMLElement)#368 (0) {
      }
    }
  }
}

所以有很多 SimpleXMLElements,甚至是内部的。我基本上想做的是创建一个数组,其中 ID 作为键,名称作为值。 为此,我目前正在做

$jobsArray = array();
$i = 0;

foreach ($oXML->Jobs->Job as $job) {
    if($job->Client->Name->__toString() == $clientName->clientName) {
        $jobsArray[$i] = array(
            $job->ID->__toString() => $job->Name->__toString()
        );
        $i++;
    }
}

现在这似乎有效,但只有当我对所有内容都使用 __toString 时才有效。出于某种原因,这样做感觉不正确。 有什么办法可以改善以上还是需要使用toString?

谢谢

您可以使用 (string)($job->ID) => (string)($job->Name)。但是在使用XML/HTML对象的时候,往往要强制转换...