【问题标题】:converting from XML -> PHP Array -> Json Encode从 XML 转换 -> PHP 数组 -> Json 编码
【发布时间】:2014-02-04 19:21:35
【问题描述】:

我正在使用 jquery tokeninput 插件和 XML 数据设置输入自动完成。

我有一个结构如下所示的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
    <majors>
        <major program="GCIS">Computing &amp; Info Sci (PHD)</major>
        <major program="UINT">Business Administration (AAS)</major>
        etc..
    </majors>

我将它加载到 PHP 中:

$majors = simplexml_load_file('../ajax/majors.xml');

然后我想做以下事情:

  • 将每个&lt;major&gt;元素重新格式化为字符串,包括program属性

    • (例如:&lt;major program="GCIS"&gt;Computing &amp;amp; Info Sci (PHD)&lt;/major&gt; 变成字符串 GCIS - Computing &amp;amp; Info Sci (PHD)
  • 通过过滤函数运行转换后的字符串。过滤器函数检查strpos($convertedString, $userQuery),如果用户的查询存在则返回真/假
  • 包含$userQuery的元素都被编码为json_encode($arr)
  • 返回 JSON 数据。

这是我目前拥有的代码...我似乎无法让格式化/过滤正常工作。

if(isset($_POST['query']) ) {
    $majors = simplexml_load_file('../ajax/majors.xml');

    # iterate through.
    foreach ($majors as $key => $value) {
        $arr = array('major' => $value['program'] . " - " . $value);
    }

    # filter the response using our query
    $arr = array_filter($arr, 'filterArrayWithQuery');

    # JSON-encode the response
    $json_response = json_encode($arr);

    # Return the response
    return $json_response;
}

# ensures that the search query is present
function filterArrayWithQuery( $string ) {
    return !strpos( $string, $query ) === false;
}

最终结果 JSON 输出应如下所示:

{"major":"GCIS - Computing &amp; Info Sci (PHD)","major":"UINT - Business Administration (AAS)"}

【问题讨论】:

  • JSON 最终结果 JSON 输出是否正确?您的关联数组有 2 个名为“major”的键。
  • @Yeah:最终结果 JSON 输出是我想要的输出。我想知道我需要进行哪些更改才能获得该输出:)
  • @Prefix 这不是有效的 JSON。所以你不能使用json_encode()来生成这样的输出。
  • 看看这个输出格式:{"majors":["GCIS - Computing &amp; Info Sci (PHD)","UINT - Business Administration (AAS)"]}。适合你吗?

标签: php jquery xml json


【解决方案1】:

在您的迭代行中,您没有附加新条目 -

# iterate through.
foreach ($majors as $key => $value) {
   $arr[] = array('major' => $value['program'] . " - " . $value);
//     ^^
}

这样输出将是-

[{"major":"GCIS - Computing & Info Sci (PHD)"},{"major":"UINT - Business Administration (AAS)"}]

【讨论】:

  • 谢谢——这是我监督的初始代码中问题的一部分。我为你的贡献投了赞成票。我还发现了另一个问题(我“返回”了 JSON 而没有回显它——显然你必须回显 JSON 数据?)
【解决方案2】:

试试这个:

function convert($xml) {
    # ensures that the search query is present
    function filterArrayWithQuery($string) {
        static $query = null;
        if (is_null($query) && isset($_POST['query'])) $query = $_POST['query'];
        return !$query || strpos($string, $_POST['query']) !== false;
    }

    $majors = simplexml_load_string($xml);
    $arr = array();

    # iterate through
    foreach ($majors as $key => $value) {
        $arr[] = array('major' => $value['program'] . " - " . htmlentities($value));
    }

    # filter the response using our query
    $arr = array_filter($arr, 'filterArrayWithQuery');

    # Return the response (JSON-encoded)
    return json_encode(array('majors' => $arr));
}

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
    <majors>
        <major program="GCIS">Computing &amp; Info Sci (PHD)</major>
        <major program="UINT">Business Administration (AAS)</major>
    </majors>
XML;

$_POST['query'] = 'Info';
echo convert($xml);

【讨论】:

    【解决方案3】:

    感谢您的意见,但我能够找出解决方案。

    这是为感兴趣的人准备的最终 PHP 脚本。

    <?php
    
    
    # vars
    $reqMethod    = $_SERVER['REQUEST_METHOD'];
    $ref          = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : "http://www.google.com";                            
    $allowedHosts = array('redacted', 'localhost'); 
    $majors       = null;
    $arr          = array();
    $query        = isset($_POST['q']) ?  $_POST['q'] : "";
    
    # confirm request is being sent from where we allow.
    if ( $reqMethod != 'POST' || !in_array(parse_url($ref, PHP_URL_HOST), $allowedHosts) ) {
    
        header('Location: ' . $ref);
    
    } else {
    
        # load in XML
        $majors = simplexml_load_file('../ajax/majors.xml');
    
        # iterate through XML. if element contains query, add it to an array.
        foreach ($majors as $key => $value) {
            if( !stristr( $value, $query ) === false ){
                $arr[] = array('major' => $value['program'] . " - " . $value);
            }
        }
    
        # Return the response - JSON encoded
        header('Content-type: application/json');
        echo json_encode($arr);
    
    }
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多