2

次の関数を使用して、配列を再帰的に検索しています。

function search2($array, $key){
    if( array_key_exists($key, $array) ){
        print("<br> ----------------- FOUND <u>{$key}</u> with value: {$array[$key]}");

        return array( $key => $array[$key] );

    }else if( !array_key_exists($key, $array) ){
        foreach ($array as $index   =>  $subarray){
                if( is_array($subarray) ){
                    print("<br> ************* <u>{$index}</u> is an ARRAY");
                    print("<br> ************* RE-SEACHING <u>{$index}</u> FOR : <u>{$key}</u>");
                    search2($subarray, $key);
                }
        }
    }
}

したがって、次の配列構造を使用します。

Array
(
    [personal] => Array
        (
            [title] => 
            [forename] => 
            [surname] => 
            [post_code] => 
            [date_of_birth] => Array
                (
                    [month] => 
                    [day] => 
                    [year] => 
                )

            [email_address] => email1@test.org
            [confirm_email_address] => 
            [mobile_telephone] => 
            [home_telephone] => 
            [work_telephone] => 
            [are_you_entering_fundraising_in_a_team] => Array
                (
                    [yes] => 0
                )

            [how_many_places_would_you_like] => 
            [team_name] => 
            [names_of_team_members] => 
            [how_did_you_hear_about_this_event] => 
            [please_tell_us_] => 
            [would_you_be_happy_for_publicity] => 
            [is_this_the_first_time_you_have_taken_part_in_or_attended_this_event] => Array
                (
                    [yes] => 0
                )

            [do_you_have_a_special_reason_for_taking_part_in_or_attending_this_event] => 
            [what_are_your_plans_for_raising_the_minimum_sponsorship_amount___please_be_as_detailed_as_possible] => 
            [number_of_tickets_required] => 1
        )
)

私の関数は、探しているインデックスが見つかるまで自分自身を呼び出し続けます。email_addressを検索していた場合、その配列キーが存在する場合、if ステートメントの最初の部分はそのインデックスの値を返す必要があります。それ以外の場合は、コードの 2 番目の部分で再帰モードになります。

問題は、次のように「見つかった」出力ステートメントを取得するため、コードが機能しているように見えることです。

print("<br> ----------------- FOUND <u>{$key}</u> with value: {$array[$key]}");

ただし、return ステートメントが想定どおりに動作することを期待していますが、関数呼び出しの時点で出力が得られません。

4

3 に答える 3

4

配列関数で再帰を使用します。

function in_array_r ( $needle, $haystack, $strict = true )
    {
        foreach ( $haystack as $value )
        {
            if (( $strict ? $value === $needle : $value == $needle ) || ( is_array ( $value ) && in_array_r ( $needle, $value, $strict )))
            {
                return true;
            }
        }

        return false;
    }

この関数は、探しているキーが見つかるまでループし続けます。

于 2012-09-25T12:54:08.590 に答える
4

また、コールバックが提供された組み込み関数array_walk_recursiveを使用することもできます。

于 2012-09-25T12:55:40.993 に答える
2

見つけた値を返す必要があるため、次のように変更します。

search2($subarray, $key);

に:

return search2($subarray, $key);
于 2012-09-25T12:53:50.883 に答える