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