2017-09-04 60 views
0

我有一個網頁,允許用戶添加特定記錄作爲'Favorite' - 作爲此過程的一部分,它將選擇記錄ID添加到數組中,如下所示:PHP Array - 刪除項目和後續數組循環

array_push($_SESSION['selectedArticleIDs'], $recid); 

,他們也未收藏夾記錄從陣列中刪除它們:

if (($key = array_search($recid, $_SESSION['selectedArticleIDs'])) !== false) { 
unset($_SESSION['selectedArticleIDs'][$key]); 
} 

因此,該陣列可能是這樣的:

[selectedArticleIDs] => Array 
     (
      [0] => 1398 
      [2] => 851 
      [3] => 1635 
      [4] => 65 
      [5] => 860 
     ) 

然後我做了查找到組中的所有選擇的收藏夾成一個列表如下:

 for($i = 0; $i < count($_SESSION['selectedArticleIDs']); $i++) { 
     ${'findreq' . ($i+1)} = $fm->newFindRequest('Articles'); 
     ${'findreq' . ($i+1)}->addFindCriterion('RecordID', $_SESSION['selectedArticleIDs'][$i]); 
     $request->add($i+1, ${'findreq' . ($i+1)}); 
     } 

出現該問題,當有人未最愛的項目 - 你可以在上面的例子看有沒有:

[1] => 1234 

數組項,在執行查找時拋出for循環,因爲它跳過數組中的最後一項(上例中的860)。

我可以看到問題在這裏,但不知道如何去解決這個問題?

+3

http://php.net/manual/en/control-structures.foreach.php –

+1

而不是'unset',你應該考慮使用['array_splice'](http://php.net/array-splice ),以便鍵可以重新編號。 –

回答

0

有不同的方法可以解決它。

您可以使用foreach代替for

$i = 1; 
foreach($_SESSION['selectedArticleIDs'] as $favourite){ 
    ${'findreq' . $i} = $fm->newFindRequest('Articles'); 
    ${'findreq' . $i}->addFindCriterion('RecordID', $favourite); 
    $request->add($i, ${'findreq' . $i}); 
    $i++; 
} 

或者,你可以使用array_values將重新索引數組

$selectedArticleIDs = array_values($_SESSION['selectedArticleIDs']); 
for($i = 0; $i < count($selectedArticleIDs); $i++) { 
    ${'findreq' . ($i+1)} = $fm->newFindRequest('Articles'); 
    ${'findreq' . ($i+1)}->addFindCriterion('RecordID', $selectedArticleIDs[$i]); 
    $request->add($i+1, ${'findreq' . ($i+1)}); 
} 
0

您可以使用foreach循環。

foreach($_SESSION['selectedArticleIDs'] as $i => $v) { 
    ${'findreq' . ($i+1)} = $fm->newFindRequest('Articles'); 
    ${'findreq' . ($i+1)}->addFindCriterion('RecordID', $v); 
    $request->add($i+1, ${'findreq' . ($i+1)}); 
} 

如果它不能解決問題,那麼你必須添加if條件來檢查鍵是否退出。我不確定你是否包含在$fm對象中。

0

的array_search呼叫不必要的開銷,你可以將其刪除,效果是一樣的。 你不應該擔心的關鍵。使用foreach而不是for循環。

$i = 1; 
foreach($_SESSION['selectedArticleIDs'] as $selectedArticleID) { 
    ${"findreq$i"} = $fm->newFindRequest('Articles'); 
    ${"findreq$i"}->addFindCriterion('RecordID', $selectedArticleID); 
    $request->add($i, ${"findreq$i"}); 
    $i++; 
} 

你真的需要變量名嗎?我認爲你應該儘量避免它。