递归PHP函数

递归PHP函数,php,Php,我试图解决这个问题来学习逻辑公式,但这个问题已经占用了我太多的时间 规则很简单,没有循环,也没有内置的PHP函数,例如print\u r、is\u array。。等等 这就是我到目前为止所想到的 function displayArray(array $inputArray, $ctr = 0, $tempArray = array()) { //check if array is equal to temparray if($inputArray != $tempArray) { /

我试图解决这个问题来学习逻辑公式,但这个问题已经占用了我太多的时间

规则很简单,没有循环,也没有内置的PHP函数,例如print\u r、is\u array。。等等

这就是我到目前为止所想到的

function displayArray(array $inputArray, $ctr = 0, $tempArray = array()) {
//check if array is equal to temparray
if($inputArray != $tempArray) {

    // check if key is not empty and checks if they are not equal
    if($inputArray[$ctr]) {
        // set current $tempArray key equal to $inputArray's corresponding key
        $tempArray[$ctr] = $inputArray[$ctr];

        if($tempArray[$ctr] == $inputArray[$ctr]) { 
            echo $tempArray[$ctr];]
        }

        $ctr++;
        displayArray($inputArray, $ctr);
    }
}
}
此程序输出以下内容:

blackgreen
当问题到达作为数组的元素时,问题就开始了

$array = array(
    'black',
    'green',
    array(
        'purple',
        'orange'
    )
);

displayArray($array);
有什么建议吗


返回值应该是:blackgreenpurpleorange

这个呢?您必须检查它是否为数组

function display_array(&$array, $index=0) {
  if (count($array)<=$index) return;
  if (is_array($array[$index])) {
    echo '[ ';
    display_array($array[$index]);
    echo '] ';
  }  
  else         
    echo "'" . $array[$index] . "' ";

  display_array($array, $index+1);
}

// Try:
// $a = ['black', 'green', ['purple', 'orange'], 'beer', ['purple', ['purple', 'orange']]];
// display_array($a);
// Output:
// 'black' 'green' [ 'purple' 'orange' ] 'beer' [ 'purple' [ 'purple' 'orange' ] ]
完整答案

$myarray = array(
    'black',
    'green',
    array(
        'purple',
        'orange'
    )
);

function printAll($a) {
    if (!is_array($a)) {
        echo $a, ' ';
        return;
    }

    foreach($a as $k => $value) {
         if($k<10){
             //printAll($k);
             printAll($value);
        }
    }
}


printAll($myarray);

尝试使用一些内置函数,如isset和is_数组,但这是一个完整的递归方法,不使用循环

function displayArray(array $inputArray, $ctr = 0) {
    if(isset($inputArray[$ctr]))
    {   
        if(is_array($inputArray[$ctr]))
        {
            return displayArray($inputArray[$ctr]);
        }
        else
        {
            echo $inputArray[$ctr];
        }   
    }
    else
    {
        return;
    }
    $ctr++;
    displayArray($inputArray, $ctr);
}

$array = array(
    'black',
    'green',
    array(
        'purple',
        'orange'
    )
);

displayArray($array);
输出:


这很有趣。我决定让它在我工作的时候能够处理大多数数据类型。只要不要抛出任何对象或空值,一切都应该正常

不再有@错误抑制。现在返回字符串,而不是回显它

我意识到isset实际上是一个语言构造而不是一个函数,但为时已晚,我采用了空终止策略来确定数组的结尾

function concatinateRecursive($array, $i = 0) {
    static $s = '';
    static $depth = 0;
    if ($i == 0) $depth++;

    // We reached the end of this array.
    if ($array === NULL) {
        $depth--;
        return true;
    }

    if ($array === array()) return false; // empty array
    if ($array === '')      return false; // empty string
    if (
        $array === (int)$array   ||      // int
        $array === (float)$array ||      // float
        $array === true          ||      // true
        $array === false         ||      // false
        $array === "0"           ||      // "0"
        $array ==  "1"           ||      // "1" "1.0" etc.
        (float)$array > 1        ||      // > "1.0"
        (int)$array !== 1                // string
       )
    {
        $s .= "$array";
        return false;
    }

    // Else we've got an array. Or at least something we can treat like one. I hope.
    $array[] = NULL; // null terminate the array.
    if (!concatinateRecursive($array[$i], 0, $s)) {
        $depth--;
        return concatinateRecursive($array, ++$i, $s);
    }
    if ($depth == 1) {
        return $s;
    }
}

$array = array(
    'black',
    'green',
    array(
        'purple',
        'orange'
    )
);

echo concatinateRecursive($array);
黑绿紫橙


$数组中的第三个值是另一个数组,前两个值是简单字符串。这怎么可能呢?那么您想检查数组$tempArray参数的作用是什么?为什么在执行递归调用时不传递这个参数呢?如果它不等于$inputArray,它将在那里进行验证。如果它不相等,它将在ctr的帮助下继续将$inputArray中的键值放入自身,这使得它在递归结束时相等。我希望这是有意义的@是的。这正是我想要做的。您需要使用is_数组来测试元素是否是数组。如果是这样,您需要在$inputArray[$ctr]上递归调用您的函数。实际上,这个问题表明人们没有阅读OP需求,而是开始转储一些随机的东西。只是说.count和is_数组是内置函数。is_数组是内置函数。@jeffery用它代替数组有什么问题吗?你只需移动数组检查步骤和reloop@saurav问题是,如果只是移动数组检查,则无法区分元素和数组本身,从而导致.is_数组和isset是内置函数。@gaurav在随机升级投票前阅读需求:没有内置PHP函数。Hmm。。伙计,你可能是2014年第一个这么做的人。你用什么调试器?编辑:我删除了@,这表明它不能正常工作。为什么需要$test变量?如果$array==[],您就不能这样做吗?嗯..@前面的函数掩盖了警告和错误。而且,函数必须返回blackgreenpurpleorange,而不是一个接一个地回显它们。使用此on assert函数会导致其他错误。对此,我深表歉意。期望函数/方法的输出通常意味着具有最终和确定的返回值。再说一次,很抱歉假设。
function concatinateRecursive($array, $i = 0) {
    static $s = '';
    static $depth = 0;
    if ($i == 0) $depth++;

    // We reached the end of this array.
    if ($array === NULL) {
        $depth--;
        return true;
    }

    if ($array === array()) return false; // empty array
    if ($array === '')      return false; // empty string
    if (
        $array === (int)$array   ||      // int
        $array === (float)$array ||      // float
        $array === true          ||      // true
        $array === false         ||      // false
        $array === "0"           ||      // "0"
        $array ==  "1"           ||      // "1" "1.0" etc.
        (float)$array > 1        ||      // > "1.0"
        (int)$array !== 1                // string
       )
    {
        $s .= "$array";
        return false;
    }

    // Else we've got an array. Or at least something we can treat like one. I hope.
    $array[] = NULL; // null terminate the array.
    if (!concatinateRecursive($array[$i], 0, $s)) {
        $depth--;
        return concatinateRecursive($array, ++$i, $s);
    }
    if ($depth == 1) {
        return $s;
    }
}

$array = array(
    'black',
    'green',
    array(
        'purple',
        'orange'
    )
);

echo concatinateRecursive($array);