2017-08-08 74 views
0

我的數據到底看起來像這樣($response):PHP繼續循環或達陣的從API返回

{ 
    "data": { 
     "connections": [ 
      { 
       "source": 1 
      }, 
      { 
       "source": 6 
      } 
     ] 
    } 
} 

所以,後來我這樣做:

$array = json_decode($response, true); 
$results = $array['data']['connections']; 
foreach($results as $member) 
{ 
    if ($member['source'] == 6) 
    { 
     function1();//run this function 
     break; 
    } 
    else 
    { 
     //what goes here? //reloop     
    } 
} 

所以,如果source等於6,那麼我運行該函數,然後停止循環。這部分是好的。問題是這個。 else是怎麼回事?我可能會有15或20個不同來源的JSON,我只需要其中的一個爲6就可以運行該功能。所以,我需要函數繼續運行,直到它找到source的6或者它沒有找到6就到達數組的末尾。如果它沒有找到6,那麼我需要運行一個不同的函數(比如說,function2)。

我該如何把這一切拉到一起?

+0

不要把一個else語句。添加一個變量source_find =假的循環之前,將其設置爲true,如果源== 6,和你的foreach循環之後,那麼如果source_find == true,那麼功能2() – hardworker

+0

你能多一點解釋清楚的預期結果?它應該爲任何給定的*號碼運行*不同*功能?這些工作是否專門完成如果它運行'function1()'它應該繼續運行其他函數還是停止? – Andy

+1

您在第二個片段中缺少一個結束花括號。 – GrumpyCrouton

回答

3

你可以使用函數像@Fortega功能findTheSix($response),或者你可以直接使用這樣的代碼:

$array = json_decode($response, true); 
$results = $array['data']['connections']; 

$six_exists = false; 

foreach($results as $member) { 
     if ($member['source'] == 6){ 
     function1();//run this function 
     $six_exists = true; 
     break; 
     } 
} 

if(false === $six_exists) { 
    function2(); 
} 

,甚至更好,你可以做這樣的:

$array = json_decode($response, true); 
if(in_array(6, array_column($array['data']['connections'], 'source'))) { 
    function1(); 
} else { 
    function2(); 
} 
+0

謝謝!兩者都很好。愛簡單的第二個。 – jonmrich

6

您可以將此代碼放入不同的函數中,並在找到6時返回。如果循環後沒有找到6,則執行功能2

function findTheSix($response){ 
    $array = json_decode($response, true); 
    $results = $array['data']['connections']; 
    foreach($results as $member) { 
      if ($member['source'] == 6){ 
      function1();//run this function 
      return; 
      } 
    } 
    function2(); 
} 
+0

所以,'return'表示再次運行'foreach',直到條件成立或數組中沒有剩下任何東西? – jonmrich

+0

不,返回停止(循環)和其餘的函數執行。見http://php.net/manual/en/function.return.php – Fortega

+0

@jonmrich請看我的答案,因爲我相信它會做你想做的。 – Andy

2

您最好將「源」放入數組中。

$source = array_column($array['data']['connections'], 'source')); 

這應該給你「源極」,存儲在數組中的值稱爲$source例如

[0 => 1, 1 => 6, ... ]; 

然後,你可以做這種類型的事情。 此檢查,而不需要整個數組循環

if (in_array(6, $source)) { 
    function1(); 
} 

這一邏輯後,您可以運行你想要的,例如,任何進一步的功能如果6$source陣列中

if (in_array(6, $source)) { 
    function1(); 
} 
function2(); 
another_function(); 

function1()將被執行。否則,function1()將不會執行。

無論if條件如何,function2()another_function()都將被執行。如果您想更改此設置,那麼只有在而不是在$source數組中,然後使用else條件(例如,

if (in_array(6, $source)) { 
    function1(); 
} else { 
    function2(); 
    another_function(); 
} 
+0

這是給我這樣一個錯誤:「PHP解析錯誤:語法錯誤,意外‘in_array’(T_STRING),期待‘(’在上線75 /test.php)」。這是該行:'如果in_array(6,$源){' – jonmrich

+0

需要的是'如果(in_array(6,$源)){'但是,這始終是跑錯功能。 – jonmrich

+0

謝謝,我剛更新了它。它在'in_array'周圍缺少'('和關閉')'。適用於我。你呢? – Andy

0
$array = json_decode($response, true); 
$results = $array['data']['connections']; 
$no_six = true; 
foreach($results as $member) { 
    if ($member['source'] == 6) { 
     function1(); 
     $no_six = false; 
     break; 
    } 
} 
if ($no_six) { 
    function2(); 
} 
  • 如果你使用['source']等於6,function1()被調用並且foreach被破壞。 $no_six重置爲false,因爲我們找到了一個。
  • 無需一個else,因爲你會想要做的,如果['source']不等於6的唯一事情就是在下一次迭代重新嘗試,如果有一個。
  • 如果foreach在沒有執行代碼的情況下結束,則表示沒有['source']等於6,然後$no_six仍然等於false。使用該信息,請致電function2()
0

與此更換你的代碼,使用與標誌更新contine,它會通過complate陣列穿越

$array = json_decode($response, true); 
$results = $array['data']['connections']; 
$no_six = 0; 
foreach($results as $member) { 
    if ($member['source'] == 6) { 
     function1(); 
     $no_six++; 
     continue; 
    } 
} 
if ($no_six>0) { 
    function2(); 
}