如何使用递归构建新数组时“跳过”迭代

问题描述 投票:0回答:3

我被困在可能非常简单的事情上。

我通过使用递归函数循环现有数组来创建一个新数组,但我似乎无法将值保持到新数组。最后,这个功能会有点复杂,但是现在我需要一些帮助。

我已经尝试了很多方法来实现这个目标,但我现在感到很茫然。

这是我的PHP功能

function recursive($array) {

    $newArray = array();

    foreach($array as $key => $value) {

        if(is_array($value)){
            recursive($value);                              
        }else{
            $newArray[] = $value;
        }   

    }

    return $newArray;

}

原样,新阵列永远不会被填满...但是,如果我改变这条线......

recursive($value); // Why can't I just call the recursive function here?

...至...

$newArray[] = recursive($value); // Instead of having to set a new value to the new array?

一切正常......除了我的目标是创建一个只有值的平面数组。

所以我的问题是,为什么有必要设置一个新的数组值才能再次调用递归函数?理想情况下,如果值是一个数组,我想跳过设置一个新的数组值,并继续循环通过原始数组。

php arrays recursion
3个回答
2
投票

使用array_merge

function recursive($array) {

    $newArray = array();

    foreach($array as $key => $value) {

        if(is_array($value)){
            $newArray = array_merge($newArray, recursive($value));                              
        }else{
            $newArray[] = $value;
        }   

    }

    return $newArray;

}

...或者你可以使用special operator

function recursive($array) {

    $newArray = array();

    foreach($array as $key => $value) {

        if(is_array($value)){
            $newArray += recursive($value);                              
        }else{
            $newArray[] = $value;
        }   

    }

    return $newArray;

}

...或者通过像这样的variable by reference

function recursive($array, &$newArray = null) {

    if (!$newArray) {
        $newArray = array();
    }

    foreach($array as $key => $value) {

        if(is_array($value)){
            recursive($value, $newArray);                              
        }else{
            $newArray[] = $value;
        }   

    }

    return $newArray;   
}

1
投票

使用array_merge()合并从recursive($value);和$ newArray返回的数组

$newArray = array_merge($newArray,recursive($value));

你可以保证$newArray在此之后会变平,因为之前$newArray的值是平的,而recursive总是返回一个平面阵列,因此两者的组合应该是一个平面阵列。


1
投票

你没有对递归函数的返回做任何事情。试试这个:

function recursive($array) {

    $newArray = array();

    foreach($array as $key => $value) {

        if(is_array($value)){
            // This is what was modified
            $newArray = array_merge($newArray, recursive($value));                              
        }else{
            $newArray[] = $value;
        }   

    }

    return $newArray;

}
© www.soinside.com 2019 - 2024. All rights reserved.