Php loại bỏ phần tử mảng theo giá trị. Sử dụng Pascal miễn phí để xử lý mảng

35 câu trả lời

Hiện hữu những cách khác loại bỏ một phần tử mảng, với một số phần tử mảng hữu ích hơn đối với một số phần tử khác nhiệm vụ cụ thể, hơn những người 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”.

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.

Nhiệm vụ này có thể được thực hiện 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ó được biết hay không (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 loại bỏ 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 những tiện ích Công cụ PHP là khả năng thu được 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à bạn có thể quên mất dữ liệu. 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.

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

Phương pháp 1. Chỉ sao chép các phần tử lẻ sang mảng khác.

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.