Lặp lại các khóa (hoặc cặp k / v) trong mảng kết hợp zsh?


23

Trong zsh, tôi muốn lặp lại trên một mảng kết hợp. Tôi cần cả khóa và giá trị. Nhưng khi tôi lặp qua mảng kết hợp thông thường ( for x in $assoc_array), tôi chỉ nhận được các giá trị.

Tất cả các ví dụ tôi đã xem cho thấy, được cung cấp một khóa , bạn có thể nhận được giá trị của nó từ một mảng kết hợp. Vấn đề của tôi là bắt đầu tập hợp các phím.

Zsh có hỗ trợ lặp lại các khóa trong một mảng kết hợp không?


Nếu bạn chỉ có một danh sách nhỏ thì đây có thể là một lựa chọn:for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
toán

Câu trả lời:


12

Bạn có thể nhận được cả khóa và giá trị cùng một lúc với việc mở rộng tham số tiện lợi này:

for key val in ${(kv)assoc_array}; do
    echo "$key -> $val"
done

Xem cờ mở rộng tham số trong hướng dẫn sử dụng Zsh.


Đây là cách đơn giản hơn +1
TimSum

Điều này không hoạt động khi các khóa hoặc giá trị có khoảng trắng trong chúng
Max Coplan

30

Tôi tiếp tục tìm kiếm sau khi đặt câu hỏi và tìm thấy câu trả lời này trên Unix StackExchange:

typeset -A assoc_array
assoc_array=(k1 v1 k2 v2 k3 v3)

for k in "${(@k)assoc_array}"; do
  echo "$k -> $assoc_array[$k]"
done

Đầu ra là:

k1 -> v1
k2 -> v2
k3 -> v3

1
Đối với bất kỳ ai muốn kiểm tra điều này theo cách hữu ích, hãy thử với nội dung $options. (Xem man zshoptions)
mVChr

Điều gì xảy ra nếu khóa không phải là một số tăng như foo, bar, v.v. như Array [foo] = baz?
Timo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.