首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP循环返回一个额外的不需要的数组(Wikipedia API)

PHP循环返回一个额外的不需要的数组(Wikipedia API)
EN

Stack Overflow用户
提问于 2017-01-05 05:45:07
回答 2查看 301关注 0票数 3

我一整天都在研究这个问题,还没有找到任何解决办法。我对php也很陌生。

我的函数的目的是获取维基百科文章的用户输入(Category1)并返回其类别。下面的基本功能可以做到这一点,没有任何问题。

代码语言:javascript
复制
function get_all_categories ( ) {

        $url = $this->get_url ( 'categories' ) ;
        $url .= 'titles='.urlencode($_POST['Category1']);
        $url .= '&cllimit=500' ;        
        $data = $this->get_result ( $url ) ;

        $array = json_decode($data, true); }

城市规划实例结果

代码语言:javascript
复制
Array
(
[batchcomplete] => 
[query] => Array
    (
        [pages] => Array
            (
                [46212943] => Array
                    (
                        [pageid] => 46212943
                        [ns] => 0
                        [title] => Urban planning
                        [categories] => Array
                            (
                                [0] => Array
                                    (
                                        [ns] => 14
                                        [title] => Category:All Wikipedia articles written in American English
                                    )

                                [1] => Array
                                    (
                                        [ns] => 14
                                        [title] => Category:Commons category with local link same as on Wikidata
                                    )

                                [2] => Array
                                    (
                                        [ns] => 14
                                        [title] => Category:Pages using ISBN magic links
                                    )

                                [3] => Array
                                    (
                                        [ns] => 14
                                        [title] => Category:Urban planning
                                    )

                                [4] => Array
                                    (
                                        [ns] => 14
                                        [title] => Category:Use American English from April 2015
                                    )

                                [5] => Array
                                    (
                                        [ns] => 14
                                        [title] => Category:Use dmy dates from April 2015
                                    )

                                [6] => Array
                                    (
                                        [ns] => 14
                                        [title] => Category:Wikipedia articles needing clarification from June 2015
                                    )

                                [7] => Array
                                    (
                                        [ns] => 14
                                        [title] => Category:Wikipedia articles with GND identifiers
                                    )

                            )

                    )

            )

    )

)

当我试图从这个数组中只提取标题值时,我的问题就开始了。我尝试用foreach循环来实现这一点,这是我为多维数组找到的最简单的解决方案:

代码语言:javascript
复制
$array1 = new RecursiveIteratorIterator(
        new RecursiveArrayIterator($array),
        RecursiveIteratorIterator::SELF_FIRST);

        foreach ($array1 as $key => $value) {
            if (is_array($value) && $key == 'categories') {
                $result = array_map(function($element){return $element['title'];}, $value);

                print_r($result);
                }               
        }

我从这段代码中得到的是两个数组。一个数组只有标题(我想要的),但也有一个不想要的数组(有时包括第一个标题)附加在末尾:

代码语言:javascript
复制
Array
(
[0] => Category:All Wikipedia articles written in American English
[1] => Category:Commons category with local link same as on Wikidata
[2] => Category:Pages using ISBN magic links
[3] => Category:Urban planning
[4] => Category:Use American English from April 2015
[5] => Category:Use dmy dates from April 2015
[6] => Category:Wikipedia articles needing clarification from June 2015
[7] => Category:Wikipedia articles with GND identifiers
)
Array
(
[ns] => 
[title] => C
)

这个额外的数组是我不明白的。我认为这个问题是由前缘循环引起的。我尝试在循环之外取消设置$variable,但没有帮助。如果我试图将这些结果传递给另一个函数,那么额外的数组就会变得特别麻烦。我怎样才能防止这种情况发生呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-05 06:56:57

为了简单起见,您可以手动遍历数组,而不是使用RecursiveIteratorIterator

RecursiveIteratorIterator将用于大型数组的杀灭性能

将提取逻辑更改为:

代码语言:javascript
复制
$result = array();
foreach($arr['batchcomplete']['query']['pages'] as $k => $v)
{
    foreach($v['categories'] as $cat)
    {
        $result[] = $cat['title'];
    }
}

https://eval.in/709842

票数 1
EN

Stack Overflow用户

发布于 2017-01-05 07:20:37

正如@samir所提到的,手动执行会更快,但是如果需要遍历未知深度的搜索机制,也可以使用基本的递归函数。它可能比OOP风格的RecursiveArrayIterator/RecursiveIteratorIterator:快一点。

代码语言:javascript
复制
function recurse($array,&$new)
    {
        foreach($array as $key => $value) {
            if($key == 'title' && isset($array['ns'])) {
                if(!isset($array['pageid']))
                    $new[]  =   $value;
            }
            else {
                if(is_array($value)) {
                    recurse($value,$new);
                }
            }
        }
    }

# Set's storage array for final titles
$new    =   array();
# Recurse your array
recurse($array,$new);
# Show stored values
print_r($new);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41478040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档