PHP - 如何在指定元素后删除数组中的所有元素

6
我有一个这样的数组:

Array ( [740073] => Leetee Cat 1 [720102] => cat 1 subcat 1 [730106] => subsubcat [740107] => and another [730109] => test cat )

我想删除所有在键为“720102”的元素后面的元素。因此,该数组将变为:

Array ( [740073] => Leetee Cat 1 [720102] => cat 1 subcat 1 )

我该如何实现这个?目前我只有以下内容...
foreach ($category as  $cat_id => $cat){
    if ($cat_id == $cat_parent_id){
    //remove this element in array and all elements that come after it 
    }
}

[EDIT] 第一个答案在大多数情况下似乎有效,但并非所有情况都如此。如果原始数组中只有两个项目,则它仅删除第一个元素而不是其后面的元素。如果仅有两个元素。

数组([740073] => Leetee Cat 1 [740102] => cat 1 subcat 1)

变成

数组([740073] => [740102] => cat 1 subcat 1)

为什么会这样?似乎是每当$position为0时。

3个回答

10

个人而言,我会使用array_keysarray_searcharray_splice。通过使用array_keys获取一个键列表,你会得到所有的键作为数组中以0为键的值,然后使用array_search查找键的键(如果这有任何意义),这将成为该键在原始数组中的位置。最后,使用array_splice删除该位置之后的任何数组值。

PHP:

$categories = array(
    740073 => 'Leetee Cat 1',
    720102 => 'cat 1 subcat 1',
    730106 => 'subsubcat',
    740107 => 'and another',
    730109 => 'test cat'
);

// Find the position of the key you're looking for.
$position = array_search(720102, array_keys($categories));

// If a position is found, splice the array.
if ($position !== false) {
    array_splice($categories, ($position + 1));
}

var_dump($categories);

输出:

array(2) {
  [0]=>
  string(12) "Leetee Cat 1"
  [1]=>
  string(14) "cat 1 subcat 1"
}

这在大多数情况下似乎有效,但不是全部。请参见原始消息的编辑,显示某些不起作用的示例。 - LeeTee
好的,答案是正确的,但如果$position = 0会有问题。需要写成($position !== FALSE)而不是if ($position)。谢谢。 - LeeTee
抱歉,那很有道理。 ;) 我会修正上面的答案。 - Francois Deschenes

-1

试试这个

$newcats = array();
foreach($category as $cat_id => $cat)
{
    if($cat_id == $cat_parent_id)
        break;

    $newcats[$cat_id] = $cat;
}

$category = $newcats;

是的,我尝试了这种方式,因为它似乎是最合理的,但出于某些原因它并不起作用... - LeeTee

-1

有几种方法可以实现这一点,但使用您当前的结构,您可以设置一个标志并在设置了标志后进行删除...

$delete = false;
foreach($category as $cat_id => $cat){
    if($cat_id == $cat_parent_id || $delete){
        unset($category[$cat_id]);
        $delete = true;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接