Php 如何将SimpleXML对象转换为数组,然后洗牌?
我的问题症结所在: 我得到了一个返回20个结果的函数。在这些结果中包含了我需要获得的所有元素。现在,我需要以随机顺序返回它们,并且能够专门处理第1项、第2-5项和第6-17项 Idea 1:用于将对象转换为数组,我可以在其中混洗。这几乎可以工作了,但是我需要获取的一些元素位于不同的名称空间下,而我似乎无法获取它们。代码:Php 如何将SimpleXML对象转换为数组,然后洗牌?,php,simplexml,Php,Simplexml,我的问题症结所在: 我得到了一个返回20个结果的函数。在这些结果中包含了我需要获得的所有元素。现在,我需要以随机顺序返回它们,并且能够专门处理第1项、第2-5项和第6-17项 Idea 1:用于将对象转换为数组,我可以在其中混洗。这几乎可以工作了,但是我需要获取的一些元素位于不同的名称空间下,而我似乎无法获取它们。代码: /* * Convert a SimpleXML object into an array (last resort). * * @access public * @p
/*
* Convert a SimpleXML object into an array (last resort).
*
* @access public
* @param object $xml
* @param boolean $root - Should we append the root node into the array
* @return array
*/
function xmlToArray($xml, $root = true) {
if (!$xml->children()) {
return (string)$xml;
}
$array = array();
foreach ($xml->children() as $element => $node) {
$totalElement = count($xml->{$element});
if (!isset($array[$element])) {
$array[$element] = "";
}
// Has attributes
if ($attributes = $node->attributes()) {
$data = array(
'attributes' => array(),
'value' => (count($node) > 0) ? xmlToArray($node, false) : (string)$node
// 'value' => (string)$node (old code)
);
foreach ($attributes as $attr => $value) {
$data['attributes'][$attr] = (string)$value;
}
if ($totalElement > 1) {
$array[$element][] = $data;
} else {
$array[$element] = $data;
}
// Just a value
} else {
if ($totalElement > 1) {
$array[$element][] = xmlToArray($node, false);
} else {
$array[$element] = xmlToArray($node, false);
}
}
}
if ($root) {
return array($xml->getName() => $array);
} else {
return $array;
}
}
$thumbfeed = simplexml_load_file('http://gdata.youtube.com/feeds/api/videos?q=skadaddlemedia&max-results=20&orderby=published&prettyprint=true');
$xmlToArray = xmlToArray($thumbfeed);
$thumbArray = $xmlToArray["feed"];
for($n = 0; $n < 18; $n++){
$title = $thumbArray["entry"][$n]["title"]["value"];
$desc = $thumbArray["entry"][0]["content"]["value"];
$videoUrl = $differentNamespace;
$thumbUrl = $differentNamespace;
}
关于这两种方法能否很好地解决我的问题,以及如果是,我如何克服执行困难的想法?非常感谢你能给予的任何帮助
更新:示例XML
我不确定hwo是否要写入foreach循环中的数组,而不是相互写入
可以使用以下命令将元素添加到数组末尾:
$array[] = "new element";
或
第一个是首选的,因为它避免了函数调用
foreach($thumbfeed->entry as $entry){
$item = array();
$thumbmedia = $entry->children('http://search.yahoo.com/mrss/')->group;
$item['thumb'] = $thumbmedia->thumbnail[0]->attributes()->url;
$thumburl = $thumbmedia->content[0]->attributes()->url;
$thumburl1 = explode("http://www.youtube.com/v/", $thumburl[0]);
$item['thumbid'] = explode("?f=videos&app=youtube_gdata", $thumburl1[1]);
$item['thumbtitle'] = $thumbmedia->title;
$thumbyt = $thumbmedia->children('http://gdata.youtube.com/schemas/2007')->duration;
$item['thumblength'] = $thumbyt->attributes()->seconds;
$items[] = $item;
}
结果将是一个数组$items[]
,其中每个元素都是与循环中的字段关联的数组
$x[]=$y
是“将$y
作为新元素附加到数组$x
”的缩写。如果您不知道如何使用名称空间获取元素,这里有一个很好的教程:如果您提供一些示例XML,我们可能会更好地帮助您。这正是我需要的;谢谢你,Amber!上一次,我需要在输入名称的末尾添加“[]”这一行。从现在起,当有疑问时,我只需在所有内容中添加“[]”,然后等待奇迹发生。
array_push($array, "new element");
foreach($thumbfeed->entry as $entry){
$item = array();
$thumbmedia = $entry->children('http://search.yahoo.com/mrss/')->group;
$item['thumb'] = $thumbmedia->thumbnail[0]->attributes()->url;
$thumburl = $thumbmedia->content[0]->attributes()->url;
$thumburl1 = explode("http://www.youtube.com/v/", $thumburl[0]);
$item['thumbid'] = explode("?f=videos&app=youtube_gdata", $thumburl1[1]);
$item['thumbtitle'] = $thumbmedia->title;
$thumbyt = $thumbmedia->children('http://gdata.youtube.com/schemas/2007')->duration;
$item['thumblength'] = $thumbyt->attributes()->seconds;
$items[] = $item;
}