【问题标题】:count($array) returning wrong array lengthcount($array) 返回错误的数组长度
【发布时间】:2015-08-17 20:56:10
【问题描述】:

我正在尝试编写一个程序,打印数组元素的所有可能排列。

示例:listPermutations($array),其中$array = array(0,1,2) 应返回六个排列 0,1,2 0,2,1 1,0,21,2,02,0,12,1,0

我目前的代码是:

<?php

    $myNumber = 3;

    function createArray($objCount){
        for($i = 0; $i < $objCount; $i++){
            $array[$i] = $i;
        }
        return $array;
    }

    function printPermutations($array, $firstObj){
        //echo var_dump($array)."<br>";
        echo count($array)."<br>";
        if(count($array) == 2){
            echo $firstObj.$array[0].$array[1];
            echo $firstObj.$array[1].$array[0];
        }
        else{
            for($i = 0; $i < count($array); $i++){
                $arrayWithoutI = array_splice($array, $i, 1);
                echo var_dump($array)."<br>";
                echo printPermutations($arrayWithoutI, $i).' ';
            }
        }
    }

    function listPermutations($objCount){
        $array = createArray($objCount);
        //echo print_r($array)."<br>";
        printPermutations($array, 0);
    }

    echo listPermutations($myNumber);
?>

代码应该递归地工作如下:

如果 $array 的数组长度不等于 2,则对于数组中的每个元素 $i 调用 printPermutaions 并删除 $i 并将 $i 作为 排列的第一个元素。

但是程序的输出如下:

3
array(2) { [0]=> int(1) [1]=> int(2) } 
1
array(0) { } 
1
array(0) { } 
1
array(0) { } 
1
array(0) { } 
1 ...
...

为什么去掉一个元素后的输出是1而不是2?

【问题讨论】:

  • echo var_dump($array) 你打印var_dump() 的返回值,这只是不必要的。 echo printPermutations(...) 也一样,它也不打印任何东西。
  • 确实如此,但这仅用于测试目的。
  • @Alex Rizier123 的意思是你根本不需要echovar_dump() 打印一个值但返回什么都没有,所以使用echo 是完全多余的。
  • 点了。感谢您的澄清。

标签: php arrays permutation


【解决方案1】:

数组拼接通过引用获取数组

array array_splice( array &$input , int $offset [, int $length [, mixed $replacement = array() ]] )

表示它正在更改给定的数组。
当您从 0 迭代到 count($array) 时,它会计算每次循环运行的数组长度。

$array = [1,2,3,4,5];
count($array); //5
array_splice($array,2);
count($array); //2

array_splice 改变数组长度。和 count($array) 变化。

【讨论】:

  • 那么既然 array_splice 通过引用获取一个数组数组,您会建议对这些数组进行临时副本还是有一个按值调用的替代方案?
  • 这也是一个选项,我不确定如果你写 $clonedArray = $array 它会克隆它(而不仅仅是给它相同的指针)。这是一种克隆数组的方法:$clonedArray = json_decode(json_encode($array));,请注意,如果数组中的某个值不可序列化(如函数或某些特殊对象),它将忽略该值
猜你喜欢
  • 1970-01-01
  • 2013-06-15
  • 2016-11-28
  • 1970-01-01
  • 2014-07-04
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多