php — как удалить все элементы массива после одного указанного

#php #associative-array

#php #ассоциативный-массив

Вопрос:

У меня есть массив, подобный этому:

Массив ( [740073] => Текущий Cat 1 [720102] => cat 1 subcat 1 [730106] => subsubcat [740107] => и другой [730109] => тестовый cat)

Я хочу удалить все элементы массива, которые идут после элемента с ключом ‘720102’. Таким образом, массив станет:

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

Как бы мне этого добиться? Пока у меня есть только belw…

 foreach ($category as  $cat_id => $cat){
    if ($cat_id == $cat_parent_id){
    //remove this element in array and all elements that come after it 
    }
}
  

[РЕДАКТИРОВАТЬ] Первый ответ, похоже, работает в большинстве случаев, но не во всех. Если в исходном массиве всего два элемента, удаляется только первый элемент, но не элемент после него. Если есть только два элемента

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

становится

Массив ( [740073] => [740102] => cat 1 вложенный cat 1 )

Почему это? Кажется, это происходит всякий раз, когда $position равно 0.

Ответ №1:

Лично я бы использовал array_keys , array_search и array_splice . Извлекая список ключей с помощью array_keys , вы получаете все ключи в виде значений в массиве, который начинается с ключа 0 . Затем вы используете array_search для поиска ключа ключа (если это имеет какой-либо смысл), который станет позицией ключа в исходном массиве. Finally 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"
}
  

Комментарии:

1. Кажется, это работает в большинстве случаев, но не во всех. Смотрите Редактирование исходного сообщения, показывающее пример того, что не работает.

2. Хорошо, ответ был правильным, но возникла проблема, если $ position = 0. Нужно написать ($position !== FALSE) вместо if ($position). Спасибо

3. Извините за это. Это имеет смысл. 😉 Я исправлю ответ выше.

Ответ №2:

Попробуйте это

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

    $newcats[$cat_id] = $cat;
}

$category = $newcats;
  

Комментарии:

1. Да, я пробовал этот способ, поскольку он кажется наиболее логичным, но по какой-то причине он не работает….

Ответ №3:

Есть несколько способов добиться этого, но, используя вашу текущую структуру, вы могли бы установить флаг и удалить, если флаг установлен …

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