Php xóa khỏi mảng theo giá trị. Loại bỏ các phần tử chẵn khỏi mảng

vị trí thứ năm - vị trí thứ sáu.

X[ 3 ] : =X [ 4 ];

X[ 4 ] : =X [ 5 ];

X[ 5 ] : =X [ 6 ];

Do đó, tất cả các phần tử từ phần thứ ba đến phần thứ năm phải được di chuyển sang trái một phần tử - thay cho phần tử thứ i, bạn cần viết (i+1)-th. Sơ đồ khối của thuật toán được hiển thị trong Hình. 5,25.


Cơm. 5,25.


Cơm. 5,26.


Cơm. 5,27.

Bây giờ chúng ta hãy xem xét thêm nhiệm vụ chung: Bạn cần xóa phần tử thứ m khỏi mảng X gồm n phần tử. Để làm điều này, chỉ cần viết phần tử thứ (m+1) vào vị trí của phần tử có số m, phần tử thứ (m+2) - vào vị trí của phần tử thứ (m+1), v.v. là đủ. , phần tử thứ n - tại chỗ (n–1)th. Quá trình loại bỏ một phần tử khỏi mảng được hiển thị trong Hình 2. 5,26.

Thuật toán loại bỏ phần tử có số m khỏi mảng X có kích thước n được hiển thị trong Hình 2. 5,27.

Sau khi loại bỏ phần tử 4 Và trên thực tế, việc dịch chuyển một phần của mảng sang trái khỏi mảng, số phần tử trong mảng sẽ thay đổi (giảm đi một) và chỉ mục của một số phần tử sẽ thay đổi. Nếu một phần tử bị xóa, thì phần tử tiếp theo sẽ thay thế và không cần phải di chuyển đến phần tử đó (bằng cách tăng chỉ số lên một). Phần tử tiếp theo chính nó di chuyển sang trái sau khi loại bỏ.

Nếu bạn đang xử lý một mảng trong đó một số phần tử bị xóa, thì sau khi xóa một phần tử, bạn không cần phải chuyển sang phần tử tiếp theo (điều này làm giảm số lượng phần tử). Ví dụ, hãy xem xét vấn đề sau đây.

NHIỆM VỤ 5.1. Loại bỏ các phần tử âm khỏi một mảng.

Thuật toán giải quyết vấn đề khá đơn giản: chúng ta duyệt qua tất cả các phần tử của mảng, nếu phần tử đó âm thì chúng ta xóa nó bằng cách dịch tất cả các phần tử tiếp theo sang trái. Điều duy nhất cần nhớ là sau khi xóa một phần tử, bạn không cần phải chuyển sang phần tử tiếp theo để xử lý tiếp theo, nó sẽ tự di chuyển đến vị trí của phần tử hiện tại. Sơ đồ khối giải bài toán 5.1 được thể hiện trên hình 2. 5,28.

Dưới đây là nội dung chương trình kèm theo bình luận.

chương trình support_array; var i, n, j: byte; X: mảng [ 1..100 ] của số thực; bắt đầu writeln('nhập kích thước mảng'); đọcln(n); (Đầu vào mảng.) for i:=1 đến n bắt đầu ghi ('X[ ', i, ' ]= '); readln(X[i]); kết thúc; writeln('mảng X'); for i:=1 to n do write (x [ i ] : 5: 2, ’ ); viết; tôi: = 1; trong khi tôi<=n) do {Если очередной элемент массива X[i] отрицателен, то} if x [ i ]<0 then begin {удаляем элемент массива с номером i.} for j:= i to n_1 do x [ j ] : = x [ j + 1 ]; {Уменьшаем размер массива.} {Не надо переходить к следующему элементу массива.} n:=n -1; end else {Если элемент не удалялся, то переходим к следующему элементу массива.} i:= i +1; writeln (’Изменённый массив ’); for i:=1 to n do {Вывод преобразованного массива.} write (X[ i ] : 5: 2, ’ ’); writeln; end.


Cơm. 5,28.

Kết quả của chương trình được trình bày trong Hình. 5,29.


Cơm. 5,29.

5.9 Chèn một phần tử vào mảng

Hãy xem xét một nhiệm vụ đơn giản: chèn số b vào mảng X(10) , giữa phần tử thứ ba và thứ tư.

Để giải quyết vấn đề này, bạn cần dịch chuyển tất cả các phần tử của mảng, bắt đầu từ phần tử thứ tư sang phải một phần tử. Sau đó, bạn sẽ cần viết b (X:=b;) vào phần tử thứ tư của mảng. Nhưng để không làm mất giá trị lân cận, trước tiên bạn phải dịch phần tử thứ mười sang phải, sau đó là phần tử thứ chín, thứ tám, v.v. cho đến phần tử thứ tư. Sơ đồ khối của thuật toán chèn được hiển thị trong Hình 2. 5h30.


Cơm. 5h30.

Trong trường hợp tổng quát, sơ đồ khối chèn số b vào mảng X(N) giữa các phần tử được đánh số m và m+1 được hiển thị trong Hình 2. 5.31.


Cơm. 5.31.

Dưới đây là đoạn chương trình thực hiện thuật toán này 5 Khi khai báo một mảng, bạn phải cung cấp đủ kích thước để chèn một phần tử. .

var i, n,m: byte; X: mảng [ 1..100 ] của số thực; b: có thật; bắt đầu viết ('N= '); đọcln(n); for i:=1 to n do started write ('X[', i, ' ]= '); readln(X[i]); kết thúc; writeln('Mảng X'); for i:=1 to n do write (x [ i ] : 5: 2, ’ ); viết; writeln('m='); đọcln(m); writeln('b='); đọcln(b); for i:=n downto m+1 do x [ i +1]:=x [ i ]; x :=b; n:=n+1; writeln('Mảng đã sửa đổi'); for i:=1 to n do write (X[ i ] : 5: 2, ’ ); viết; kết thúc.

5.10 Sử dụng các thủ tục để làm việc với mảng

Hãy xem cách bạn có thể chuyển mảng vào chương trình con. Như bạn đã biết (xem Chương 4), để khai báo các biến trong danh sách các tham số hình thức của một chương trình con, bạn phải xác định tên và kiểu của chúng. Tuy nhiên, loại của bất kỳ tham số nào trong danh sách chỉ có thể là loại tiêu chuẩn hoặc được khai báo trước đó. Do đó, để truyền một mảng vào chương trình con, trước tiên bạn phải mô tả kiểu của nó 6 Kiểu dữ liệu mảng, khai báo mảng xem phần 2.4.9. Làm việc với mảng được mô tả chi tiết trong chương này. rồi khai báo thủ tục:

mảng_type = mảng[danh sách chỉ mục] của kiểu;

thủ tục

thủ tục_name(mảng_name: mảng_type);

Ví dụ:

gõ vector=mảng [ 1..10] byte; ma trận=mảng [ 1.. 3, 1.. 3 ] của số thực; thủ tục proc (A: ma trận; b: vector; var x: vector);

Rõ ràng là việc truyền một chuỗi có dạng tới một chương trình con

tên biến: sợi dây[chiều dài chuỗi];

thực chất là một mảng gồm 7 Kiểu dữ liệu “chuỗi”, khai báo chuỗi xem mệnh đề 2.4.9, nên thực hiện tương tự:

hàng_type = sợi dây[chiều dài chuỗi];

thủ tục

tên thủ tục(string_name: string_type);

Ví dụ:

gõ chuỗi_5=chuỗi [ 5]; nét_10=chuỗi [ 1 0 ]; hàm fun (S t r: stroka_5): stroka_10;

Mảng có thể được chuyển đến chương trình con bằng cách sử dụng khái niệm mảng mở. Mảng mở là mảng 8 Kiểu dữ liệu "mảng", khai báo mảng, truy cập mảng, xem phần 2.4.9., phần mô tả cho biết loại phần tử mà nó bao gồm, nhưng không xác định ranh giới để thay đổi các chỉ mục:

public_array_name: mảng của mảng... kiểu;

Ví dụ:

var array_1: mảng thực; array_2: mảng mảng char; mảng_3: mảng mảng mảng byte;

Cấp phát bộ nhớ và chỉ định ranh giới chỉ mục

Mảng là một trong những cấu trúc dữ liệu hữu ích và được sử dụng thường xuyên nhất trong bất kỳ ngôn ngữ lập trình nào. Biết cách quản lý mảng và các phần tử của chúng là rất quan trọng và hữu ích. Trong bài viết này, chúng ta sẽ xem xét cách bạn có thể loại bỏ các phần tử riêng lẻ của một mảng trong PHP.

Tác vụ này có thể được thực hiện bằng các phương pháp khác nhau, tùy thuộc vào những gì chúng ta biết về phần tử bị xóa - liệu khóa đã được biết (số hoặc mã định danh của phần tử trong mảng) hay chỉ giá trị của nó.

Loại bỏ một phần tử trong mảng bằng khóa của nó

Nếu khóa phần tử được biết thì nhiệm vụ rất đơn giản. Chức năng bỏ đặt() cho phép bạn xóa một phần tử mảng hoặc bất kỳ biến nào (bộ nhớ máy tính sử dụng cho biến đó cũng sẽ bị xóa).

Ví dụ: chúng ta có một mảng:

$myArr = mảng(1,2,3,4,5);

Để xóa phần tử có giá trị "3", hãy sử dụng mã:

unset($myArr);

Xin lưu ý rằng không phải giá trị (3) được chỉ định mà là khóa phần tử (2), bắt đầu từ trong trường hợp này từ 0. Vì vậy, nếu bạn cần xóa phần tử đầu tiên của mảng, hãy chỉ định phần tử 0:

unset($myArr);

Cũng cần lưu ý rằng sau hai lần xóa, mảng hiện chứa ba phần tử:

Mảng
=> 2
=> 4
=> 5
)

Tất cả các khóa của các phần tử còn lại được giữ nguyên. Theo đó, nếu bây giờ bạn cần xóa phần tử đầu tiên thì bạn sẽ cần chỉ định một phần tử làm khóa. Do đó, và cũng bởi vì chúng ta không phải lúc nào cũng biết số lượng phần tử trong mảng mà chỉ biết giá trị của nó, nên tùy chọn này có thể không phù hợp.

Xóa một phần tử mảng theo giá trị của nó

Nếu không biết khóa của một phần tử mà chỉ biết giá trị của mảng, thì bạn sẽ phải lặp qua tất cả các phần tử của mảng và xóa phần tử bạn đang tìm kiếm. Ví dụ: chúng tôi xóa một phần tử có giá trị "3":

$myArr = mảng(1,2,3,4,5);
foreach ($myArr as $key => $item)(
nếu ($ mục == 3)(
unset($myArr[$key]);
}
}

* Xin lưu ý rằng điều kiện kiểm tra giá trị mảng có sẵn trong vòng lặp trong biến $item và khi xóa, khóa phần tử được chỉ định (biến $key).

Thuật toán này cũng phù hợp nếu bạn cần xóa một nhóm phần tử cùng một lúc. Rốt cuộc, ở đây có một điều kiện xác định những phần tử nào cần xóa.

Loại bỏ các phần tử mảng giao nhau

Một trong phương tiện tiện lợi PHP có thể lấy một mảng các phần tử không giao nhau với các phần tử của mảng khác. Để làm điều này, hãy sử dụng chức năng mảng_diff(). Nó lấy mảng làm tham số, trả về một mảng mới. Ví dụ: có một mảng ban đầu $myArr mà từ đó chúng ta chỉ cần các phần tử không có trong mảng $myArr2:

$myArr = mảng(1,2,3,4,5);
$myArr2 = mảng(3,4);

Bằng cách áp dụng hàm mảng_diff(), chúng ta nhận được một mảng mới chỉ chứa các phần tử cần thiết:

$resArr = array_diff($myArr, myArr2);

Kết quả là $resArr sẽ chứa:

Mảng
=> 1
=> 2
=> 5
)

* Điều đáng chú ý là các khóa được lưu khi tạo một mảng mới. Ngoài ra, điều đáng biết là việc lựa chọn chỉ đến từ mảng đầu tiên. Vì vậy, nếu có các phần tử duy nhất khác trong $myArr2, chẳng hạn như “6” hoặc “7”, thì điều này sẽ không ảnh hưởng đến kết quả dưới bất kỳ hình thức nào - chúng sẽ không được thêm vào mảng mới.

Các hàm làm việc với mảng và các thao tác trên mảng (Phần 2)

Hợp nhất mảng

Hợp nhất (nối) mảng là thao tác tạo ra một mảng bao gồm các phần tử của nhiều mảng khác. Hợp nhất các mảng là một hoạt động rất nguy hiểm, vì kết quả của việc hợp nhất tuân theo logic riêng của nó mà quên mất dữ liệu có thể bị mất. Việc hợp nhất các mảng được thực hiện bằng toán tử " + " hoặc sử dụng chức năng Việc hợp nhất chỉ có thể được thực hiện bằng chức năng mảng_merge().

Giả sử chúng ta có hai mảng:

$A = mảng("1"=>"Đầu tiên", "2"=>"Thứ hai");
$B = array("3"=>"Thứ ba", "4"=>"Thứ tư");

Bây giờ hãy hợp nhất hai mảng này thành một mảng $C:

Nhà điều hành " + " không giao hoán cho mảng. Điều này có nghĩa là $A + $B không công bằng $B + $A.

Theo kết quả của ví dụ đã xem xét, chúng ta sẽ nhận được một mảng $C có dạng sau:

"1"=>"Đầu tiên", "2"=>"Thứ hai", "3"=>"Thứ ba", "4"=>"Thứ tư"

Và kết quả là $B + $A chúng ta sẽ nhận được mảng này:

"3"=>"Thứ ba", "4"=>"Thứ tư", "1"=>"Đầu tiên", "2"=>"Thứ hai"

Phương pháp này không hoạt động khi hợp nhất danh sách. Hãy giải thích sự thật này Ví dụ:

Giả sử chúng ta có hai mảng:

$A = mảng(10,11,12);
$B = mảng(13,14,15);

Kết quả của việc hợp nhất danh sách $A$B ($A + $B) ta được: 10,11,12. Và đây hoàn toàn không phải là kết quả mà chúng tôi mong muốn nhận được... Điều này là do khi hợp nhất các danh sách có cùng chỉ mục, một phần tử của mảng đầu tiên vẫn nằm trong mảng kết quả và ở cùng một vị trí. Trong trường hợp này chúng ta cần sử dụng hàm

Ví dụ sử dụng hàm đếm():

$arr = 5 ;
$arr = 4 ;
$arr = 8 ;
$arr = 3 ;
$arr = 8 ;
tiếng vọng "

Số phần tử mảng: ". đếm($arr). "

" ;
// Kết quả đầu ra: Số phần tử mảng: 5
?>

Xóa một mảng và các phần tử của nó

Nếu bạn muốn xóa toàn bộ mảng, hãy sử dụng hàm bỏ đặt().

Nếu bạn muốn xóa cặp khóa/giá trị, bạn cũng có thể sử dụng hàm bỏ đặt(). Hãy cung cấp cho ví dụ cụ thể:

$arr = mảng(5 => 1, 12 => 2);

$arr = 56 ; // Tại thời điểm này trong kịch bản, nó là
// tương đương với $arr = 56;

$arr["x"] = 42; // Điều này thêm một cái mới vào mảng
// phần tử có khóa "x"
Diễn đàn cổng thông tin PHP. S.U.

35 câu trả lời

Có nhiều cách khác nhau để loại bỏ một phần tử mảng, trong đó một số cách hữu ích hơn đối với một số tác vụ cụ thể so với các cách khác.

Xóa một phần tử mảng

Nếu bạn chỉ muốn xóa một phần tử của một mảng, bạn có thể sử dụng \unset() hoặc cách khác là \array_splice() .

Ngoài ra, nếu bạn có một giá trị và không biết khóa để xóa phần tử, bạn có thể sử dụng \array_search() để lấy khóa.

phương thức \unset()

Xin lưu ý rằng khi bạn sử dụng \unset(), các khóa mảng sẽ không bị thay đổi/lập chỉ mục lại. Nếu bạn muốn lập chỉ mục lại các khóa, bạn có thể sử dụng \array_values() sau \unset() để chuyển đổi tất cả các khóa thành các khóa được đánh số bắt đầu từ 0.

$ mảng = mảng (0, 1, 2, 3); bỏ đặt ($ mảng); $array = array_values($array); var_dump ($ mảng); /* mảng(3) ( => int(0) => int(1) => int(3) ) */

// Mảng ban đầu của chúng ta $arr = array("blue", "green", "red", "vàng", "xanh", "cam", "vàng", "chàm", "đỏ"); print_r($arr); // Loại bỏ các phần tử có giá trị màu vàng hoặc đỏ $arr = array_diff($arr, array("gold", "red")); print_r($arr);

Đây là đầu ra từ đoạn mã trên:

Mảng ( => xanh dương => xanh lá cây => đỏ => vàng => xanh lá cây => cam => vàng => chàm => đỏ) Mảng ( => xanh dương => xanh lá cây => xanh lá cây => cam => chàm)

Bây giờ array_values() sẽ lập chỉ mục lại mảng số, nhưng nó sẽ xóa tất cả các chuỗi khóa khỏi mảng và thay thế chúng bằng số. Nếu bạn cần lưu trữ tên khóa (chuỗi) hoặc lập lại chỉ mục mảng nếu tất cả các khóa đều là số, hãy sử dụng array_merge():

$arr = array_merge(array_diff($arr, array("vàng", "đỏ"))); print_r($arr);

Mảng ( => xanh dương => xanh lá cây => xanh lá cây => cam => chàm)

Nếu bạn có một mảng được lập chỉ mục bằng số trong đó tất cả các giá trị là duy nhất (hoặc chúng không phải là duy nhất nhưng bạn muốn xóa tất cả các phiên bản giá trị nhất định), bạn có thể chỉ cần sử dụng array_diff() để xóa phần tử tương ứng, chẳng hạn

$my_array = array_diff($my_array, array("Value_to_remove"));

Ví dụ:

$my_array = array("Andy", "Bertha", "Charles", "Diana"); echo sizeof($my_array) . "\N"; $my_array = array_diff($my_array, array("Charles")); echo sizeof($my_array);

Sau đây được hiển thị:

Trong ví dụ này, phần tử có giá trị "Charles" sẽ bị xóa, vì có thể được xác minh bằng cách sử dụng các lệnh gọi đến sizeof(), báo cáo kích thước là 4 cho mảng ban đầu và 3 sau khi xóa.

Phá hủy một phần tử của mảng

bỏ đặt()

$array1 = mảng("A", "B", "C", "D", "E"); bỏ đặt($array1); // Xóa giá trị chỉ mục (2) đã biết khỏi mảng var_dump($array1);

Đầu ra sẽ là:

Mảng(4) ( => string(1) "A" => string(1) "B" => string(1) "D" => string(1) "E" )

Nếu bạn cần lập chỉ mục lại mảng:

$array1 = array_values($array1); var_dump($array1);

Sau đó, đầu ra sẽ là:

Mảng(4) ( => string(1) "A" => string(1) "B" => string(1) "D" => string(1) "E" )

Xóa phần tử ở cuối mảng- trả về giá trị của phần tử bị xóa

mảng_pop hỗn hợp (mảng &$ mảng)

$stack = array("cam", "chuối", "táo", "quả mâm xôi"); $last_fruit = array_pop($stack); print_r($stack); print_r("Quả cuối cùng:".$last_fruit); // Phần tử cuối cùng của mảng

Sẽ có một lối thoát

Mảng ( => cam => chuối => táo) Quả cuối cùng: quả mâm xôi

Xóa phần tử đầu tiên (màu đỏ) khỏi mảng, - trả về giá trị của phần tử bị xóa

mảng_shift hỗn hợp (mảng &$ mảng)

$color = array("a" => "đỏ", "b" => "xanh" , "c" => "xanh"); $first_color = array_shift($color); print_r ($ màu); print_r("Màu đầu tiên: ".$first_color);

Đầu ra sẽ là:

Mảng ([b] => xanh lục [c] => xanh lam) Màu đầu tiên: đỏ

unset() hủy các biến đã chỉ định.

Hành vi của unset() bên trong một hàm có thể khác nhau tùy thuộc vào loại biến bạn đang cố gắng hủy.

Nếu một biến toàn cầu hóa không được đặt() bên trong một hàm thì chỉ có biến cục bộ bị hủy. Biến trong môi trường gọi sẽ giữ nguyên giá trị trước khi unset() được gọi.

Phản hồi của đoạn mã trên sẽ là quán ba.

Để unset() một biến toàn cục bên trong hàm:

Đối với mảng kết hợp sử dụng bỏ đặt :

$arr = array("a" => 1, "b" => 2, "c" => 3); unset($arr["b"]); // KẾT QUẢ: mảng("a" => 1, "c" => 3)

Mảng số

Đối với mảng số sử dụng mảng_splice :

$arr = mảng(1, 2, 3); mảng_splice($arr, 1, 1); // KẾT QUẢ: mảng(0 => 1, 1 => 3)

Ghi chú

Nếu bạn cần xóa nhiều giá trị trong một mảng và các mục trong mảng đó là đối tượng hoặc dữ liệu có cấu trúc, sự lựa chọn tốt nhất. Những mục trả về true từ hàm gọi lại, sẽ được lưu.

$array = [ ["x"=>1,"y"=>2,"z"=>3], ["x"=>2,"y"=>4,"z"=>6], ["x"=>3,"y"=>6,"z"=>9] ]; $results = array_filter($array, function($value) ( ​​​​return $value["x"] > 2; )); //=> [["x"=>3,"y"=>6,z=>"9"]]

Nếu bạn cần xóa nhiều mục khỏi mảng kết hợp, bạn có thể sử dụng array_diff_key() (array_flip() được sử dụng ở đây):

$my_array = array("key1" => "value 1", "key2" => "value 2", "key3" => "value 3", "key4" => "value 4", "key5" => "giá trị 5",); $to_remove = mảng("key2", "key4"); $result = array_diff_key($my_array, array_flip($to_remove)); print_r($kết quả);

Mảng ( => giá trị 1 => giá trị 3 => giá trị 5)

Giả sử bạn có mảng sau:

Mảng ( => 193 => 5)

Để xóa hoạt động lưu trữ:

Unset($attributes["storage"]); $attributes = array_filter($attributes);

Và bạn sẽ nhận được:

Mảng ( => 193)

Tôi chỉ muốn nói rằng tôi đã có đối tượng cụ thể có các thuộc tính thay đổi (về cơ bản nó đang hiển thị một bảng và tôi đang thay đổi các cột trong bảng, do đó các thuộc tính trong đối tượng phản ánh bảng cũng có thể thay đổi):

Lớp obj ( protected $fields = array("field1","field2"); protected $field1 = array(); protected $field2 = array(); protected Loadfields()() // Điều này sẽ tải $field1 và $ field2 với các hàng dữ liệu cho cột mà chúng mô tả hàm được bảo vệ clearFields($num)( foreach($fields as $field) ( unset($this->$field[$num]); // Điều này không hoạt động với dòng bên dưới đã hoạt động unset($this->($field)[$num]); // Trước tiên bạn phải giải quyết $field bằng cách sử dụng () ) ) )

Toàn bộ mục đích của $fields rất đơn giản nên tôi không cần phải tìm bất kỳ đâu trong mã khi chúng thay đổi, tôi chỉ cần nhìn vào phần đầu của lớp và thay đổi danh sách thuộc tính và nội dung mảng trường $để phản ánh những thuộc tính mới.

Thực hiện theo các chức năng mặc định

$Array = mảng("test1","test2","test3","test3"); unset($Array);

$Array = mảng("test1","test2","test3","test3"); mảng_pop($Array);

$Array = mảng("test1","test2","test3","test3"); mảng_splice($Array,1,2);

$Array = mảng("test1","test2","test3","test3"); mảng_shift($Array);

Mặc dù unset() đã được đề cập một vài lần ở đây, nhưng điều đáng nói là unset() chấp nhận nhiều biến, giúp dễ dàng loại bỏ nhiều phần tử không liền kề khỏi một mảng trong một thao tác:

// Xóa nhiều phần tử không liền kề khỏi một mảng $array = [ "foo", "bar", "baz", "quz" ]; unset($array, $array); print_r ($ mảng); // Kết quả: ["foo", "bar" ]

unset() một cách linh hoạt

unset() không chấp nhận một mảng khóa cần xóa, do đó mã bên dưới sẽ không thành công (mặc dù việc sử dụng unset() động sẽ dễ dàng hơn một chút).

$ mảng = phạm vi (0,5); $xóa = ; $array = unset($remove); // LỖI: "không được đặt" bất ngờ print_r($array);

Thay vào đó, unset() có thể được sử dụng linh hoạt trong vòng lặp foreach:

$ mảng = phạm vi (0,5); $xóa = ; foreach ($remove as $k=>$v) ( unset($array[$v]); ) print_r($array); // Đầu ra: [ 0, 3, 4, 5 ]

Xóa các khóa mảng bằng cách sao chép mảng

Ngoài ra còn có một thực tế khác chưa được đề cập. Đôi khi cách dễ nhất để loại bỏ các khóa mảng nhất định là chỉ cần sao chép $array1 sang $array2.

$array1 = phạm vi (1,10); foreach ($array1 as $v) ( // Xóa tất cả các số nguyên chẵn khỏi mảng if($v % 2) ( $array2 = $v; ) ) print_r($array2); // Kết quả: [ 1, 3, 5, 7, 9 ];

Rõ ràng thực tiễn tương tự cũng áp dụng cho dòng văn bản:

$array1 = [ "foo", "_bar", "baz" ]; foreach ($array1 as $v) ( // Xóa tất cả các chuỗi bắt đầu bằng dấu gạch dưới if(strpos($v,"_")===false) ( $array2 = $v; ) ) print_r($array2); // Kết quả: ["foo", "baz" ]

Các giải pháp:

  1. Để xóa một phần tử, hãy sử dụng unset() :
bỏ đặt ($ mảng); unset($array["foo"]);
  1. Để xóa nhiều phần tử không liền kề, hãy sử dụng unset() :
unset($array, $array); unset($array["foo"], $array["bar"]);
  1. Để loại bỏ nhiều phần tử liền kề, hãy sử dụng array_splice() :
mảng_splice($array, $offset, $length);

Giải thích thêm:

$array = $array["foo"] = "";

Ngoài cú pháp, còn có sự khác biệt logic giữa việc sử dụng unset() và gán phần tử. Câu đầu tiên nói rằng Cái này không còn tồn tại nữa và cái thứ hai nói rằng Cái này vẫn tồn tại, nhưng giá trị của nó là chuỗi trống.

Nếu bạn đang xử lý các con số, tốt hơn nên chọn 0. Vì vậy, nếu công ty ngừng sản xuất đĩa xích kiểu XL1000, công ty sẽ cập nhật hàng tồn kho của mình:

Unset($products["XL1000"]);

Tuy nhiên, nếu tạm thời hết đĩa xích XL1000 nhưng dự kiến ​​nhận lô mới từ nhà máy vào cuối tuần này thì điều này tốt hơn:

$products["XL1000"] = 0; $animals = array_values($animals);

Xóa phần tử mảng dựa trên khóa:

Sử dụng chức năng unset như hình dưới đây:

$a = mảng("salam", "10", 1); bỏ đặt($a); print_r($a); /* Kết quả: Mảng ( => salam => 1) */

Xóa phần tử mảng dựa trên giá trị:

Sử dụng hàm array_search để lấy khóa của phần tử và sử dụng phương thức trên để xóa phần tử mảng như dưới đây:

$a = mảng("salam", "10", 1); $key = array_search(10, $a); if($key !== false) ( unset($a[ $key ]); ) print_r($a); /* Kết quả: Mảng ( => salam => 1) */

Tạo mảng của bạn trong biến $array và sau đó nơi tôi đặt "phần tử bạn muốn xóa", bạn đặt một cái gì đó như: "a". Và nếu bạn muốn xóa một số thì: “a”, “b”.

Vấn đề này có thể được giải quyết bằng nhiều cách.

Phương pháp 1. Sao chép sang mảng khác thì không phần tử chẵn.

hằng N = 20 ; var a, b: mảng [ 1 .. N ] số nguyên ; tôi, m: byte; bắt đầu ngẫu nhiên; với i: = 1 đến N bắt đầu a[ i] : = Random(40 ) + 10 ; viết (a[ i] : 3 ) ; kết thúc ; viết ; m := 0 ; với i: = 1 đến N làm gì nếu a[ i] mod 2<>0 thì bắt đầu m : = m + 1 ; b[ m] : = a[ i] ; kết thúc ; for i: = 1 to m do started write (b[ i] : 3 ); kết thúc ; viết ; kết thúc.

Đây là cách dễ nhất để loại bỏ các phần tử mảng (trong trường hợp này là số chẵn) vì nó không yêu cầu nén mảng ban đầu. Trong lời giải bài toán trình bày ở trên, biến m lưu trữ số phần tử lẻ tìm được và đồng thời khi điền vào mảng thứ hai là chỉ số thay đổi của các phần tử.

Phương pháp 2. Xóa các phần tử chẵn trong mảng hiện tại, ghi đè chúng bằng các phần tử lẻ nằm ở bên phải.

hằng N = 10 ; var a: mảng [ 1 .. N ] số nguyên ; tôi, k, m: byte ; bắt đầu ngẫu nhiên; với i: = 1 đến N bắt đầu a[ i] : = Random(40 ) + 10 ; viết (a[ i] : 3 ) end ; viết ; tôi := 1 ; m := N; trong khi tôi<= m do if a[ i] mod 2 = 0 then begin m : = m- 1 ; for k: = i to m do a[ k] : = a[ k+ 1 ] ; end else i : = i+ 1 ; for i: = 1 to m do write (a[ i] : 3 ) ; writeln ; end .

Phương pháp giải quyết vấn đề này phức tạp hơn. Ở đây, nếu gặp một phần tử chẵn thì toàn bộ phần còn lại của mảng sẽ được dịch chuyển về phía trước một ô. Trong trường hợp này, phần tử chẵn tìm thấy sẽ bị ghi đè. Biến m bị giảm vì số lượng phần tử mảng trở nên nhỏ hơn.

Phương pháp này nên được coi là hợp lý nhất (tuy nhiên, mảng mở có thể không được nghiên cứu trong một khóa học ở trường). Trong các phiên bản trước, các mảng không thực sự được giảm bớt; chỉ một phần của mảng được hiển thị trên màn hình. Có thể chỉ cần lặp lại mảng ban đầu, không làm gì với nó và chỉ hiển thị các phần tử lẻ.

Một mảng mở cho phép bạn thay đổi độ dài của nó. Trong giải pháp cho vấn đề dưới đây, sau khi các phần tử lẻ được dịch chuyển và các phần tử lẻ bị “ghi đè”, độ dài của mảng sẽ thay đổi (sử dụng thủ tục setlength). Nó đặt độ dài mới của mảng. Một đặc điểm của mảng mở trong Pascal là việc lập chỉ mục của chúng bắt đầu từ 0.

hằng N = 10 ; var a: mảng số nguyên ; i, j, m: byte ; bắt đầu ngẫu nhiên; SetLength(a, N) ; for i : = 0 đến N- 1 bắt đầu a[ i] : = Random(40 ) + 10 ; viết (a[ i] : 3 ) ; kết thúc ; viết ; tôi := 0 ; // chỉ mục của phần tử đầu tiên m: = n- 1; // chỉ số cuối cùng trong khi tôi<= m do if a[ i] mod 2 = 0 then begin for j : = i to m- 1 do a[ j] : = a[ j+ 1 ] ; m : = m - 1 end else i : = i + 1 ; SetLength(a, m+ 1 ) ; // phần tử cuối cùng có chỉ số m, nhưng có m+1 phần tử for i: = 0 to m do write (a[ i] : 3 ); viết ; kết thúc.

Một ví dụ về thực thi mã chương trình.