Рекурсивная функция для многомерного массива? - PullRequest
0 голосов
/ 19 декабря 2011

Я пытаюсь использовать рекурсивную функцию для поиска в многомерном массиве, таком как приведенный ниже, для поиска определенных значений, то есть людей, которые посещали определенную школу, специализировались по определенному предмету, занимали определенное должность и т. Д.Если вам интересно, этот массив выводится из Facebook Graph API.На самом деле существует более 3 смещенных массивов, в зависимости от количества друзей у пользователя, это может быть тысячи.

Вот решение, которое я попробовал с очень небольшим знанием рекурсивных функций (моей первой мыслью было использование in_array, прежде чем я обнаружил, что оно не работает для массивов md):

Итак, чтобы дать вамЧтобы понять, как работает приведенный ниже массив md, посмотрите этот фрагмент кода:

$friend = $fqlResult[0]['name'];
echo "$friend";

* Вывод будет "ПУСТО", так как я удалил имя человека.

$data = $fqlResult;
$collegemajor = (isset($value['education'][0]['concentration'][0]['name'])) ? $value['education'][0]['concentration'][0]['name'] : null ;
$major = "Business Administration";
if (isset($collegemajor)) {
    foreach($data as $key=> $value) {
          if ($value($collegemajor) == $major) {
              echo "User $key is majoring in $major";
     }
  }
}

Итак, вот многомерный массив, указанный выше.В этом примере я хочу получить имена всех друзей пользователя, которые специализировались в Business Admin.в колледже.Как вы можете видеть из этого фрагмента, их нет (я думаю), но в длинной версии массива их много.Приведенный выше код не производит вывод, и я заблудился, как заставить его работать.Любая помощь будет принята с благодарностью.

 Array
(
[0] => Array
    (
        [name] => BLANK
        [education] => 
        [work] => 
    )

[1] => Array
    (
        [name] => BLANK
        [education] => Array
            (
                [0] => Array
                    (
                        [school] => Array
                            (
                                [id] => 108087985890571
                                [name] => St. Andrew's School
                            )

                        [year] => Array
                            (
                                [id] => 138383069535219
                                [name] => 2005
                            )

                        [type] => High School
                    )

                [1] => Array
                    (
                        [school] => Array
                            (
                                [id] => 20697868961
                                [name] => Boston University
                            )

                        [concentration] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 108654845832522
                                        [name] => Business Administration
                                    )

                            )

                        [type] => College
                    )

                [2] => Array
                    (
                        [school] => Array
                            (
                                [id] => 108289315859633
                                [name] => University of Miami
                            )

                        [year] => Array
                            (
                                [id] => 138879996141011
                                [name] => 2013
                            )

                        [type] => Graduate School
                    )

            )

        [work] => Array
            (
            )

    )

[2] => Array
    (
        [name] => BLANK
        [education] => Array
            (
                [0] => Array
                    (
                        [school] => Array
                            (
                                [id] => 115444241803885
                                [name] => Saint Andrews High School
                            )

                        [year] => Array
                            (
                                [id] => 137616982934053
                                [name] => 2006
                            )

                        [type] => High School
                    )

                [1] => Array
                    (
                        [school] => Array
                            (
                                [id] => 112033702149888
                                [name] => Boca Raton High
                            )

                        [year] => Array
                            (
                                [id] => 137616982934053
                                [name] => 2006
                            )

                        [type] => High School
                    )

                [2] => Array
                    (
                        [school] => Array
                            (
                                [id] => 108087985890571
                                [name] => St. Andrew's School
                            )

                        [type] => High School
                    )

                [3] => Array
                    (
                        [school] => Array
                            (
                                [id] => 107573562605861
                                [name] => Duke University
                            )

                        [concentration] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 104045469631213
                                        [name] => Political science
                                    )

                            )

                        [type] => College
                    )

            )

        [work] => 
    )

[4] => Array
    (
        [uid] => 1234567
        [name] => BOB NO ONE
        [education] => Array
            (
                [0] => Array
                    (
                        [school] => Array
                            (
                                [id] => 106039752760627
                                [name] => Berwick Academy
                            )

                        [year] => Array
                            (
                                [id] => 137616982934053
                                [name] => 2006
                            )

                        [type] => High School
                    )

                [1] => Array
                    (
                        [school] => Array
                            (
                                [id] => 108087985890571
                                [name] => St. Andrew's School
                            )

                        [type] => High School
                    )

                [2] => Array
                    (
                        [school] => Array
                            (
                                [id] => 105690226130720
                                [name] => Northeastern University
                            )

                        [concentration] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 108654845832522
                                        [name] => Business Administration
                                    )

                            )

                        [type] => College
                        [classes] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 189873264368867
                                        [name] => 2011
                                    )

                            )

                    )

            )

Ответы [ 2 ]

0 голосов
/ 19 декабря 2011

Требуется функция, которая найдет определенное значение в определенном поле в массиве,

function arraySearch($key, $value, $array){
  $flag = FALSE;
  foreach($array as $result){
    if(arraySearch($key, $value, $result)){
      $flag = TRUE
    }elseif(isset($result[$key] && $result[$key] == $value){
      $flag = TRUE;
    }
  }
  return $flag
}

для повышения производительности вместо установки $ flag в значение true, вы можете вернуть true, так как это остановит выполнение функции и не позволит продолжить поиск в массиве.

Назови это так

foreach($fqlResult as $result){
  if(arraySearch('concentration', 'Business Administration', $result)){
    //You have found a user you are looking for, echo $result['name'] or do what you want with the result. 
  }
}
0 голосов
/ 19 декабря 2011

Нет необходимости в рекурсии для чего-то подобного, учитывая, что глубина дерева всегда фиксирована, а структура известна.Использование некоторых вложенных циклов поможет вам:

$friends = $fqlResult;
$friends_BA = array();

foreach ($friends as $friend) {
    if (is_array($friend['education'])) {
        foreach ($friend['education'] as $school) {
            if (isset($school['concentration'])) {
                foreach ($school['concentration'] as $concentration) {
                    if (strpos(strtolower($concentration['name']), 'business') !== false) {
                        $friends_BA[] = $friend;
                        continue 3; // skip to the next friend
                    }
                }
            }
        }
    }
}

var_dump($friends_BA);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...