Trả về các mục x đầu tiên từ mảng


139

Tôi muốn trả lại 5 mục đầu tiên từ mảng. Tôi có thể làm cái này như thế nào?


5
wtf với downvotes trong câu hỏi này?
SilentGhost

2
Tôi ủng hộ tất cả, vì mỗi câu trả lời là tốt.
Vili

Câu trả lời:


273

array_slice trả về một lát của một mảng

$sliced_array = array_slice($array, 0, 5)

là mã bạn muốn trong trường hợp của bạn để trả về năm phần tử đầu tiên


1
nhưng điều này sẽ không làm việc với các mảng kết hợp. các phím bị mất.
ESCOBAR

4
@ESCOBAR: mảng kết hợp không nhất thiết phải có một thứ tự, chúng chỉ ánh xạ các khóa thành các giá trị; vì vậy "giá trị 3 đến 7" dù sao cũng không thực sự có ý nghĩa như vậy
knittl

đúng, nhưng trong trường hợp này nó không liên quan đến trật tự. nó chỉ là về 5 mục đầu tiên. và bạn không thể sử dụng Array_slice tại đây.
ESCOBAR

2
@ESCOBAR: không có mục đầu tiên nếu bạn không có đơn hàng được xác định. "Đầu tiên" chỉ hoạt động nếu bạn có thể biết mặt hàng nào đến trước hoặc sau mặt hàng khác. Nhưng chỉ để giải trí, bạn có thể kết hợp lại các khóa với các giá trị của mảng (mặc dù vẫn chưa có thứ tự xác định):array_combine(array_slice(array_keys($array), 0, 5), array_slice($array, 0, 5))
knittl

1
@darkhorizon: " array_slice trả về một lát của một mảng". Nhưng tôi sẽ chỉnh sửa câu trả lời của mình để làm cho nó rõ ràng hơn một chút.
knittl

9

mảng_splice - Xóa một phần của mảng và thay thế nó bằng một thứ khác:

$input = array(1, 2, 3, 4, 5, 6);
array_splice($input, 5); // $input is now array(1, 2, 3, 4, 5)

Từ hướng dẫn sử dụng PHP:

array array_splice ( array &$input , int $offset [, int $length = 0 [, mixed $replacement]])

Nếu độ dài bị bỏ qua, loại bỏ mọi thứ từ phần bù đến phần cuối của mảng . Nếu độ dài được chỉ định và là dương, thì nhiều yếu tố sẽ bị xóa. Nếu độ dài được chỉ định và âm thì phần cuối của phần bị loại bỏ sẽ là nhiều phần tử từ cuối mảng. Mẹo: để xóa mọi thứ từ offset đến cuối mảng khi thay thế cũng được chỉ định, hãy sử dụng số đếm ($ input) cho chiều dài.


cú pháp để trả về 5 phần tử đầu tiên là Array_splice ($ input, 5)
aland

@AndrejsCainikovs Theo php.net, "Nếu độ dài bị bỏ qua, thì chuỗi sẽ có mọi thứ từ bù cho đến hết mảng." Văn bản trả lời in đậm chính xác ngược lại.
Kalko

@Kalko: có lẽ bạn đã nhìn nhầm trang. Tuyên bố dán sao chép của tôi vẫn còn hiệu lực: php.net/manual/en/feft.array-splice.php
Andrejs Cainikovs

@AndrejsCainikovs, người bạn đời thực sự của tôi, tôi đã có trang cho Array_slice và không nhận thấy câu trả lời của bạn là về mảng_splice ... xấu của tôi: D
Kalko

3

Nếu bạn chỉ muốn xuất 5 phần tử đầu tiên, bạn nên viết một cái gì đó như:

<?php

  if (!empty ( $an_array ) ) {

    $min = min ( count ( $an_array ), 5 );

    $i = 0;

    foreach ($value in $an_array) {

      echo $value;
      $i++;
      if ($i == $min) break;

    }

  }

?>

Nếu bạn muốn viết một hàm trả về một phần của mảng, bạn nên sử dụng Array_slice:

<?php

  function GetElements( $an_array, $elements ) {
    return array_slice( $an_array, 0, $elements );
  }

?>

0

Bạn có thể sử dụng hàm Array_slice, nhưng bạn sẽ sử dụng các giá trị khác? hay chỉ có 5 người đầu tiên? bởi vì nếu bạn sẽ chỉ sử dụng 5 đầu tiên, bạn có thể sử dụng GIỚI HẠN trên SQL.


-4

Một cách hướng đối tượng hơn sẽ là cung cấp một phạm vi cho phương thức # []. Ví dụ:

Giả sử bạn muốn 3 mục đầu tiên từ một mảng.

số = [1,2,3,4,5,6]

số [0..2] # => [1,2,3]

Giả sử bạn muốn các mục x đầu tiên từ một mảng.

số [0..x-1]

Điều tuyệt vời của phương thức này là nếu bạn yêu cầu nhiều mục hơn mảng có, nó chỉ đơn giản trả về toàn bộ mảng.

số [0..100] # => [1,2,3,4,5,6]


3
Nhưng php không hỗ trợ phạm vi. Bạn có chắc là bạn không nói về ruby ​​hay những thứ tương tự không?
Victor Marchuk

2
"Một cách hướng đối tượng hơn"? Câu trả lời này không liên quan gì đến lập trình hướng đối tượng.
Ducky
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.