Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将SimpleXML对象转换为数组,然后洗牌?_Php_Simplexml - Fatal编程技术网

Php 如何将SimpleXML对象转换为数组,然后洗牌?

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

我的问题症结所在: 我得到了一个返回20个结果的函数。在这些结果中包含了我需要获得的所有元素。现在,我需要以随机顺序返回它们,并且能够专门处理第1项、第2-5项和第6-17项

Idea 1:用于将对象转换为数组,我可以在其中混洗。这几乎可以工作了,但是我需要获取的一些元素位于不同的名称空间下,而我似乎无法获取它们。代码:

/*
 * 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;
}