Php 我尝试foreach循环从XML加载到json的XML文件

Php 我尝试foreach循环从XML加载到json的XML文件,php,json,xml,foreach,Php,Json,Xml,Foreach,我尝试foreach循环XML文件。首先,它从XML文件转换为JSON,然后转换为PHP数组,我正试图使用foreach函数(使用Zend框架)循环该数组 问题是,当XML文件只有一个活动时,整个代码不起作用;当XML文件有多个活动时,代码起作用: <?php header('Content-type: application/javascript; charset=utf-8'); set_include_path(implode(PATH_SEPARATOR, array(

我尝试foreach循环XML文件。首先,它从XML文件转换为JSON,然后转换为PHP数组,我正试图使用foreach函数(使用Zend框架)循环该数组

问题是,当XML文件只有一个活动时,整个代码不起作用;当XML文件有多个活动时,代码起作用:

<?php
header('Content-type: application/javascript; charset=utf-8');

set_include_path(implode(PATH_SEPARATOR, array(
    'library',
    get_include_path()
)));

require_once('Zend/Loader.php');

Zend_Loader::loadClass('Zend_Loader_Autoloader');

$autoloader = Zend_Loader_Autoloader::getInstance();

$xmlStringContents = file_get_contents("activities.xml");

$jsonContents = Zend_Json::fromXml($xmlStringContents, true);

$decodedValues = Zend_Json::decode($jsonContents);

$project[0] = array("key" => "", "value" => "Please select...");

$i = 1;

foreach ($decodedValues['Envelope'] as $key => $value) {
  foreach ($value as $keyEnvelope => $valueEnvelope) {

    if (is_array($valueEnvelope)) {
        foreach ($valueEnvelope['EFIAIFProjActivity'] as $keyEFIAIFProjTable => $valueEFIAIFProjTable) {
            if (is_array($valueEFIAIFProjTable)) {
                foreach ($valueEFIAIFProjTable as $projectValue) {

                    if (isset($_GET['project'])) {

                        if ($_GET['project']==$projectValue['Project']['ProjId'] && $_GET['project'] != "") {
                            $project[$i] = array("key" => $projectValue['smmActivities']['ActivityNumber'], "value" => $projectValue['smmActivities']['PSADescription']);
                            $i++;
                        }

                    }
                }
            }
        }
    }
  }
}

if ($i==1) {
    $project[$i] = array("key" => "NO_ACTIVITY_000001", "value" => "No Activity");
}

$projects = array("values" => $project);

if (isset($_GET['callback'])) {
echo $_GET['callback']."(";
echo Zend_Json::encode($projects);
echo ")";
}
,“value”=>“请选择…”);
$i=1;
foreach($decodedValues['Envelope']作为$key=>$value){
foreach($keyEnvelope=>$valueEnvelope的值){
if(is_数组($valueEnvelope)){
foreach($valueEnvelope['EFAIFProjactivity']作为$KeyEFAIFProjTable=>$ValueEFAIFProjTable){
if(是_数组($valuefiafprojtable)){
foreach($valuefiafprojtable as$projectValue){
如果(isset($\u GET['project'])){
如果($\u GET['project']==$projectValue['project']['ProjId']&&$\u GET['project']!=“”){
$project[$i]=数组(“键”=>$projectValue['smmActivities']['ActivityNumber'],“值”=>$projectValue['smmActivities']['PSADCRIPTION']);
$i++;
}
}
}
}
}
}
}
}
如果($i==1){
$project[$i]=数组(“键”=>“无活动”\u000001”,“值”=>“无活动”);
}
$projects=数组(“值”=>$project);
如果(isset($\u GET['callback'])){
echo$_GET['callback'].“(”;
echo Zend_Json::encode($projects);
回声“)”;
}

我需要让这段代码像这样工作,它使一个JSON字符串与“请选择…”和“无活动”的活动动态下拉菜单,如果动态下拉菜单项目选择的项目在Atlassian JIRA和Tempo加载项中没有活动。若所选项目在XML文件中有一个或多个活动,那个么“活动”下拉菜单中有这些活动

如果XML只有一个节点,那么
Zend Framework
将其转换为JSON作为键值对

如果XML有多个节点,则
Zend Framework
将其转换为JSON数组

您可以通过两种方式处理此问题

  • 检查它是否是数组,然后循环它,否则直接通过它的键访问值

  • 如果节点不是数组,则在解码后将其转换为数组


  • 简单的解决方案是不将XML转换为JSON
    SimpleXML
    允许您在XML DOM上使用对象/可遍历语法。因此,如果您作为对象属性访问子元素,它将被视为单个值,如果您作为列表(使用foreach)访问它,它将被视为列表

    当前解决方案的主要区别在于必须使用对象属性语法,而不是数组语法


    另一件事是,您的代码看起来像是读取SOAP。虽然SOAP使用XML语法进行序列化,但它“不仅仅是XML”。你最好使用一个特定的SOAP库。

    现在我几乎可以让它工作了,但是SimpleXML及其foreach循环使这个JSON字符串:({“值”:[{“键”:“,“值”:“请选择…”,{“键”:{“0”:“000003”},“值”:{“0”:“某些活动”})不是({“值”:[{“键”:“值”:“请选择…”,{“键”:“000003”;“值”:“某些活动”})我认为SimpleXML是一种正确的方法,但是我需要更多的帮助。