Подтвердить что ты не робот

Удалить запись из массива

Я хочу сделать sth. например:

foo=(a b c)
foo-=b
echo $foo # should output "a c"

Как удалить запись из массива? foo-=b не работает.

Удаление должно работать независимо от того, где находится запись.

4b9b3361

Ответ 1

Чтобы удалить номер элемента $i: a=("${(@)a[1,$i-1]}" "${(@)a[$i+1,$#a]}")

(Более простая конструкция a=($a[1,$i-1] $a[$i+1,$#a]) также удаляет пустые элементы.)

ДОБАВЛЕНО:

Чтобы удалить любое событие b: a=("${(@)a:#b}")
:# - это иероглиф для удаления соответствующих элементов; "" и (@) должны корректно работать на массивах, даже если они содержат пустые элементы.

Ответ 2

Второй ответ Gilles правильный, если вы хотите удалить все вхождения, но это полное переназначение массива и не касается ситуации, когда вы хотите удалить только одну запись, независимо от дубликатов. В zsh есть способ удалить элемент из обычного массива без переназначения всего массива:

Учитывая следующий массив:

array=(abc def ghi)

следующее возвращает индекс первого соответствия для def:

${array[(i)def]}

и следующий формат может быть использован для удаления любого заданного индексированного значения (индекс элемента 2 в этом примере) в массиве без переопределения всего массива:

array[2]=()

таким образом, чтобы удалить значение def, мы объединяем два:

array[$array[(i)def]]=()

Это очиститель для удаления одного элемента, поскольку нет явного переназначения массива (очистка, при которой любые потенциальные побочные эффекты, такие как случайное удаление пустых элементов, проблемы с цитируемым форматом и т.д., не собираются возникать). Однако решение Gilles в значительной степени эквивалентно и имеет преимущество при удалении нескольких совпадающих элементов, если это то, что вы хотите. С его методом и этим методом у вас есть полный набор инструментов для удаления элемента стандартного массива.

Ответ 3

foo = (1 2 3)

shift foo

print $foo дает: 2 3

Итак, это удаляет первый элемент (это то, что вы хотите?)

[редактировать]

удалите i-й элемент с помощью

foo[$i] =()

вместо.

Ответ 4

Чтобы удалить элемент с содержимым "b" из массива:

foo=(a b c)
foo=(${foo#b})