Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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递归函数不';行不通_Php - Fatal编程技术网

php递归函数不';行不通

php递归函数不';行不通,php,Php,我很难理解为什么这不起作用。我有一个递归函数,它检查多维数组中的值是否存在。 然后我有get_teams()函数,我只想从中返回唯一的值。我使用find_value()函数检查唯一值,但它仍然返回所有值。。有人能解释一下发生了什么事吗?提前谢谢 function find_value( $array, $searched_val ) { foreach ( $array as $key => $val ) { if ( $val === $searched_val

我很难理解为什么这不起作用。我有一个递归函数,它检查多维数组中的值是否存在。 然后我有
get_teams()
函数,我只想从中返回唯一的值。我使用
find_value()
函数检查唯一值,但它仍然返回所有值。。有人能解释一下发生了什么事吗?提前谢谢

function find_value( $array, $searched_val ) {
    foreach ( $array as $key => $val ) {
        if ( $val === $searched_val ) {
            return true;
        }

        if ( is_array( $val ) ) {
            return find_value( $val, $searched_val );
        }
    }
    return 0;
}

get_teams();

function get_teams() {
    $people = get_data( 'some/file.json' );
    $teams = [];

    foreach ( $people as $person ) {
        if (  ! find_value( $teams, $person['team'] ) ) {
            $teams[] = [ 'text' => $person['team'] ];
        }
    }
    return $teams;
}
这是示例输入

Array
(
[0] => Array
    (
        [id] => 1
        [name] => Friedrich Robel
        [team] => WordPress
        [position] => Frontend Developer
        [salary] => 4400
    )

[1] => Array
    (
        [id] => 2
        [name] => Mr. Christop Veum
        [team] => HTML
        [position] => Manager
        [salary] => 1200
    )

[2] => Array
    (
        [id] => 3
        [name] => Demarco Rippin
        [team] => HTML
        [position] => QA
        [salary] => 4400
    )

[3] => Array
    (
        [id] => 4
        [name] => Felicia Farrell
        [team] => HTML
        [position] => QA
        [salary] => 1200
    )

[4] => Array
    (
        [id] => 5
        [name] => Torrance Fritsch
        [team] => HTML
        [position] => Assistant Manager
        [salary] => 2500
    )

[5] => Array
    (
        [id] => 6
        [name] => Erica Daugherty
        [team] => Mail
        [position] => Assistant Manager
        [salary] => 500
    )
)
我想要这个输出

 Array
(
[0] => WordPress,
[1] => HTML,
[2] => Mail
)

您的问题是返回子搜索的结果而不进行测试

您必须测试其值,而不是返回find_值(…)

function find_value( $array, $searched_val ) {
    foreach ( $array as $key => $val ) {
        if ( $val === $searched_val ) {
            return true;
        }

        if ( is_array( $val ) ) {

            // Here, you have to test the result before to return TRUE.
            if (find_value( $val, $searched_val )) {
                return true ;
            }
        }
    }
    return 0;
}

您的问题是返回子搜索的结果而不进行测试

您必须测试其值,而不是返回find_值(…)

function find_value( $array, $searched_val ) {
    foreach ( $array as $key => $val ) {
        if ( $val === $searched_val ) {
            return true;
        }

        if ( is_array( $val ) ) {

            // Here, you have to test the result before to return TRUE.
            if (find_value( $val, $searched_val )) {
                return true ;
            }
        }
    }
    return 0;
}

正如Syscall发布的那样,该修复程序用于测试
find_value()
的返回,并且仅在为真时返回

由于您的代码现在是结构化的,它将从递归调用返回true或false,这将始终是必需的,因为您将您的值存储为
['text'=>$person['team']]

代码的设计方式是,在
foreach
之外使用
return 0
仅在未找到匹配项的情况下返回false。因此,从该条件的内容返回
false
是不成熟的。循环没有机会迭代和测试所传递数组的所有值。这种提前返回会导致重复的数组条目

在任何情况下,最后的结果都将是一个
['text'=>'']
数组成员的数组。如果只需要作业字符串,请按如下方式分配:

$teams[] = $person['team'];

如果进行此更改,则不需要另一个。请注意,它还消除了递归的需要,因为
$teams
将只包含一个字符串数组。

正如Syscall发布的那样,修复程序用于测试
find_value()
的返回,并且仅当它为真时才返回

由于您的代码现在是结构化的,它将从递归调用返回true或false,这将始终是必需的,因为您将您的值存储为
['text'=>$person['team']]

代码的设计方式是,在
foreach
之外使用
return 0
仅在未找到匹配项的情况下返回false。因此,从该条件的内容返回
false
是不成熟的。循环没有机会迭代和测试所传递数组的所有值。这种提前返回会导致重复的数组条目

在任何情况下,最后的结果都将是一个
['text'=>'']
数组成员的数组。如果只需要作业字符串,请按如下方式分配:

$teams[] = $person['team'];

如果进行此更改,则不需要另一个。请注意,它还消除了递归的需要,因为
$teams
将只包含字符串数组。

我们需要样本输入和所需输出来告诉您问题。我们需要样本输入和所需输出来告诉您问题。