2017-09-04 59 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++; 
} 

你真的需要变量名吗?我认为你应该尽量避免它。