【问题标题】:How to return some data in an array from this?如何从中返回数组中的一些数据?
【发布时间】:2012-06-18 12:18:57
【问题描述】:

我有以下数据:

<media:group>
    <media:content url="http://www.url.com" bitrate="450" width="320" duration="32" />
    <media:content url="http://www.url.com" bitrate="212" width="320" duration="32" />
</media:group>

我想搜索这个并形成一个这样的数组:

Array (
[0] =>
 [url] => http://www.url.com,
 [bitrate] => 459,
 [width] => 320,
 [duration] => 32
[1] =>
 [url] => http://www.url.com,
 [bitrate] => 212,
 [width] => 320,
 [duration] => 32
)

上面的数组只是我希望如何返回数据的一个例子。

我该怎么做?此信息有时会发生变化,并且还会包含其他内容。

谢谢

【问题讨论】:

  • 我建议使用 XML Parser 而不是 preg_match。您让您和维护代码的人的生活更轻松。
  • 我正在使用一个,但它返回的只是“ [media:group] => ”而不是其中的内容。
  • 您应该能够访问内部的另一个级别。你能把你卡住的代码贴出来吗?

标签: php xml rss preg-match


【解决方案1】:

这会起作用。

<?php
$xml = '<media_group>
    <media_content url="http://www.url.com" bitrate="450" width="320" duration="32" />
    <media_content url="http://www.url.com" bitrate="212" width="320" duration="32" />
</media_group>
';
$xml = simplexml_load_string($xml);

// do an xpath query and get all item id's 
$result = $xml->xpath( '//media_content' );

$idList = array();
foreach($result as $key => $node) {
    foreach($node->attributes() as $attr=>$value) {
        $idList[$key][ (string)$attr ] = (string)$value;
    }
}

print_r($idList);
?>

注意:我已将 media: 更改为 media_,因为我不知道您针对 media 使用的命名空间。为此,您必须先使用registerXpathNamespace,然后才能处理代码。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    你应该试试SimpleXML。示例 #5 涵盖了 XML 元素的属性,类似于数组的访问。

    【讨论】:

    • 这不会输出 media:group。
    • 这是一个代码,它实际上以完全期望的格式输出您的 XML:pastebin.com/VwzkAm5k
    【解决方案3】:
    preg_match_all("@url\=\"(?P<url>.*?)\"\s+bitrate\=\"(?P<bitrate>.*?)\"\s+width\=\"(?P<width>.*?)\"\s+duration=\"(?P<duration>.*?)\"@msi", $sYourString, $aResult, PREG_SET_ORDER);
    

    或其他解决方案:

    先把所有的item分开,然后一个一个去,得到所有的属性。

    $aMyFullResult = array();
    
    preg_match_all("@<media:content(?P<substring>.*?)/>@msi", $sYourString, $aResults, PREG_SET_ORDER);
    
    foreach ($aResults as $iKey=>$aOneRow)
      preg_match_all("@\s+(\w+)\=\"(.*?)\"\s+@msi", $aOneRow['substring'], $aMyFullResult[], PREG_SET_ORDER);
    
    print_r($aMyFullResult);
    

    【讨论】:

    • 嗨,安东,谢谢!那种工作,但它带回了 3 个 URL 副本?
    • 嘿 Latox,尝试使用 print_r 分析结果。通过一些简单的步骤,您可以获得所需的结果。 :)
    • 我在 foreach 中的 preg 匹配出现错误:preg_match_all() 期望参数 2 是字符串、数组
    • 好的,为您修复了一些代码 :) 立即尝试。请分析错误,修复它很简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2017-11-26
    • 1970-01-01
    • 2019-06-10
    • 2017-12-22
    相关资源
    最近更新 更多