php递归函数不起作用

时间:2018-03-05 22:03:54

标签: php

我有一个问题需要理解为什么这不起作用。我有递归函数谁检查多维数组中的值是否存在。 然后我有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
)

2 个答案:

答案 0 :(得分:2)

您的问题是您在不进行测试的情况下返回子搜索的结果。

而不是return find_value(...),您必须测试其值。

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;
}

答案 1 :(得分:0)

正如Syscall发布的那样,修复是为了测试find_value()的返回,并且只有在返回时才返回。

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

代码的设计方式与return 0之外的foreach只是在未找到匹配的情况下返回false。因此,从该条件的内容返回false为时尚早。您的循环没有机会迭代并测试传递的数组的所有值。这种早期返回会导致重复的数组条目。

在任何情况下,最后的结果都是['text' => '<job>']数组成员的数组。如果您只想要作业字符串,请改为使用:

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

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