2011-12-19 138 views
0

我使用以下代碼循環遍歷多維數組,並找到去某個大學的用戶,在本例中爲UCF。通過多維數組循環

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

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

d($friends_BA); 

多維數組看起來像這樣。這是從Facebook的圖形API的朋友列表:

Array 
(
[0] => Array 
    (
     [name] => PERSON 
     [education] => 
    ) 

[1] => Array 
    (
     [name] => PERSON 
     [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 
        ) 

      ) 

    ) 

[2] => Array 
    (
     [name] => PERSON 
     [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 
        ) 

      ) 

    ) 

[3] => Array 
    (
     [name] => PERSON 
     [education] => 
    ) 

[4] => Array 
    (
     [name] => PERSON 
     [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 
            ) 

          ) 

        ) 

      ) 

    ) 

我碰到了類似的程序,找出用戶的主修是做了工作的某些科目,但由於某些原因,上面的代碼不起作用。這是工作的那個:

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

foreach ($friends as $friend) { 
$isBA = false; 
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['name']; 
        continue 3; // skip to the next friend 
       } 
      } 
     } 
    } 
    } 
} 

d($friends_BA); 

一如既往,任何幫助將真誠讚賞。節日快樂!

UPDATE

任何人想利用這一個刺?

$friends = $fqlResult; 
     $friends_BA = array(); 
     foreach ($friends as $friend) { 
     $isBA = false; 
      if (is_array($friend['current_location'])) { 
       foreach ($friend['current_location'] as $location) { 
       if (isset($location)) { 
        foreach ($location['city'] as $city) { 
         $lowerName = strtolower($city); 
         if (strpos($lowerName, 'orlando') !== false || strpos($lowerName, 'gainesville') !== false) { 
         $friends_BA[] = $friend['name']; 
         continue 3; // skip to the next friend 
         } 
        } 
        } 
       } 
      } 
      } 

     d($friends_BA); 

數組是這樣的:

Array 
(
[0] => Array 
    (
     [name] => PERSONS NAME 
     [current_location] => Array 
      (
       [city] => New York 
       [state] => New York 
       [country] => United States 
       [zip] => 
       [id] => 108424279189115 
       [name] => New York, New York 
      ) 

    ) 

[1] => Array 
    (
     [name] => PERSONS NAME 
     [current_location] => 
    ) 

[2] => Array 
    (
     [name] => PERSONS NAME 
     [current_location] => 
    ) 

[3] => Array 
    (
     [name] => PERSONS NAME 
     [current_location] => 
    ) 

[4] => Array 
    (
     [name] => PERSONS NAME 
     [current_location] => Array 
      (
       [city] => San Jose 
       [state] => California 
       [country] => United States 
       [zip] => 
       [id] => 111948542155151 
       [name] => San Jose, California 
      ) 

    ) 

[5] => Array 
    (
     [name] => PERSONS NAME 
     [current_location] => Array 
      (
       [city] => Boston 
       [state] => Massachusetts 
       [country] => United States 
       [zip] => 
       [id] => 106003956105810 
       [name] => Boston, Massachusetts 
      ) 

    ) 

被玩弄了一個小時,但似乎無法使它發揮作用。我在第二個foreach聲明中得到了無效的論點。

+0

測試的代碼,完全按照與陣列結構和3項。它返回了預期的結果。你確定你正在使用最新版本嗎?你確定你的'd'功能正確嗎? – 2011-12-19 20:31:23

+0

你指的是第一個正確的?尋找UCF學生的那個? – buttonitup 2011-12-19 20:36:28

+0

大聲笑哎呀:)我的歉意,讓我看看現在的頂端。請參閱下面的解答。 – 2011-12-19 20:38:01

回答

1

你的問題是case SensiTivity。您使用字符串strtolower來檢查大學,但是,您發佈的大學字符串具有混合大小寫。將其更改爲這條線,它應該工作:

if (strpos(strtolower($name['name']), 'university of central florida') !== false) { 

如果您希望的情況下匹配,去掉strtolower,加上大寫字母回到它應該匹配的情況下也是如此。

UPDATE

問題的第二部分是$name['name']應該只是$name。由於您直接訪問學校數組,它正在循環訪問該部分。

if (strpos(strtolower($name), 'university of central florida') !== false) { 

這應該這樣做。所以基本上這個foreach循環遍歷數組,所以這個名字作爲一個字符串值出現,而不是數組的一部分。

UPDATE 2

$lowerName = strtolower($name); 
if (strpos($lowerName, 'university of central florida') !== false 
     || strpos($lowerName, 'ucf') !== false) { 
+0

什麼都沒有。只是一個空陣列。 – buttonitup 2011-12-19 20:43:56

+0

已更新。 @mattrmclaren – 2011-12-19 21:13:44

+0

我怎麼能檢查中央佛羅里達大學或ucf大學?在那個聲明中? – buttonitup 2011-12-19 21:23:03

0

試着用這兩個函數一起檢查整個數組。

他們是完全動態的,並將超過多維數組的任何複雜性。

我使用它來回顯所有維度爲1,你可能會用它來檢查key =>值對,並檢查它是否是你正在尋找的。

function workwitharrays($v) { 
if (is_array($v)) { 
foreach ($v as $key => $value) { 
    if (is_array($value)) { 
     workwitharrays($value); 
    } elseif (!is_array($value)) { 
     echo "<tr><td>{$key}</td><td>{$value}</td></tr>"; 
    } 
} 
} 
} 

function array_get_key_val($firstarray) { 
if (is_array($firstarray)) { 
foreach ($firstarray as $k => $v) { 
    if (is_array($v)) { 
     workwitharrays($v); 
    } elseif (!is_array($v)) { 
    echo "<tr><td>{$k}</td><td>{$v}</td></tr>"; 
    } 
} 
} 
} 

echo "<table><tbody>"; 
array_get_key_val($ArrayMultidim); 
echo "</tbody></table"; 
-1

你能詳細說明你的意思是「沒有工作」嗎?如果你的測試數據是正確的,那麼沒有什麼應該添加到你的$ friends_BA []數組中,因爲這些人都沒有參加'中佛羅里達大學'。

您是否收到錯誤?你可能想從你的價值中去除撇號。聖安德魯的可能會導致一個問題時,如果說法試圖做到這一點

If('St. Andrew's' == 'University of Central Florida') 

這應該會導致一個錯誤。

+0

我認爲你需要了解更多關於變量內部的引號如何不需要轉義以對其他值進行測試。如果聖安德魯從隊列中出來,而且他沒有手動編寫它,它會解析得很好。如果他手動編寫它,那麼你可以將它周圍的單引號改爲雙引號,它也可以很好地工作,或者簡單地將其轉義。但這不是問題。 – 2011-12-19 20:19:38

+0

我的意思是它只是返回一個空數組。擺脫撇號只會帶來一個錯誤:字符串。 – buttonitup 2011-12-19 20:26:27

+0

感謝您的信息布拉德。我知道大部分。當時我在黑暗中刺傷,因爲我不確定他的意思是「不起作用」。他澄清說它只是返回一個空數組。馬特,你確定陣列裏面有一個價值等於「中佛羅里達大學」的價值嗎?你的測試用例沒有這樣的價值。在那個測試用例中,應該返回一個空數組,對嗎?換句話說,我認爲它對於那個測試用例來說工作正常。 – 2011-12-19 20:55:13