Lấy giá trị cuối cùng của mảng. PHP: Loại bỏ các phần tử mảng. Xóa phần tử bằng phương thức chuỗi

đầu ra phím (24)

Tôi đang viết trình tạo truy vấn SQL bằng cách sử dụng một số tham số. Trong Java, rất dễ dàng để phát hiện phần tử cuối cùng của mảng từ vòng lặp for bằng cách kiểm tra vị trí hiện tại của mảng với độ dài của mảng.

Vì(int i=0; i< arr.length;i++){ boolean isLastElem = i== (arr.length -1) ? true: false; }

Trong PHP chúng có các chỉ mục không nguyên để truy cập mảng. Vì vậy, bạn phải lặp qua mảng bằng vòng lặp foreach. Điều này trở nên rắc rối khi bạn cần đưa ra một số quyết định (trong trường hợp của tôi, hãy thêm tham số or/and khi xây dựng truy vấn).

Tôi chắc chắn phải có một số cách tiêu chuẩn để làm điều này.

Làm thế nào để bạn giải quyết điều này trong PHP?

câu trả lời

Bạn cũng có thể làm một cái gì đó như thế này:

Kết thúc($elements); $endKey = key($elements); foreach ($elements as $key => $value) ( ​​​​if ($key == $endKey) // -- đây là mục cuối cùng ( // làm gì đó ) // thêm mã )

Bạn cũng có thể thử cách này để thực hiện truy vấn của mình...hiển thị ở đây bằng cách sử dụng INSERT

"thứ hai","hai"=>"thứ ba","ba"=>"thứ tư","bốn"=>"thứ năm","năm"=>"thứ sáu","sáu"=>"thứ bảy"," bảy"=>"chủ nhật"); $keys = array_keys($week); $string = "XÁC NHẬN VÀO my_table (""; $string .= implode("","", $keys); $string .= "") GIÁ TRỊ (""; $string .= implode("","" , $week); $string .= "");"; tiếng vang $chuỗi; ?>

Tôi có cảm giác mạnh mẽ rằng gốc rễ của "vấn đề XY" này OP chỉ đơn giản muốn có một hàm implode().

Vì mục đích tìm mảng EOF của bạn chỉ là keo dán. Hãy xem các chiến thuật dưới đây. Bạn không cần EOF:

$given_array = array("column1"=>"value1", "column2"=>"value2", "column3"=>"value3"); $keo = ""; foreach($given_array as $column_name=>$value)( $where .= " $glue $column_name = $value"; // gắn thêm keo $glue = "AND"; ) echo $where;

Cột1 = giá trị1 VÀ cột2 = giá trị2 VÀ cột3 = giá trị3

Đây là một cách khác để làm điều đó:

$arr = phạm vi (1, 10); $end = end($arr); đặt lại($arr); while(list($k, $v) = each($arr)) ( if($n == $end) ( echo "last!"; ) else ( echo sprintf("%s ", $v); ) )

Đối với các kịch bản tạo truy vấn SQL hoặc bất kỳ hành động nào khác trên phần tử đầu tiên hoặc cuối cùng, việc tránh sử dụng các bước kiểm tra biến không cần thiết sẽ nhanh hơn nhiều (nhanh gần như gấp đôi).

Giải pháp được chấp nhận hiện tại sử dụng vòng lặp và kiểm tra bên trong vòng lặp sẽ được thực hiện mọi_single_iteration, cách chính xác (nhanh) để thực hiện việc này là:

$numItems = đếm($arr); $i=0; $firstitem=$arr; $i++; trong khi($i<$numItems-1){ $some_item=$arr[$i]; $i++; } $last_item=$arr[$i]; $i++;

Một thử nghiệm nhỏ tại nhà cho thấy như sau:

test1: 100.000 lần chạy mô hình nhà xác

thời gian: 1869,3430423737 mili giây

test2: 100.000 lần chạy mô hình, nếu là phiên bản mới nhất

thời gian: 3235,6359958649 mili giây

Tôi thích những điều sau đây vì tôi cảm thấy nó khá gọn gàng. Giả sử chúng ta tạo một chuỗi có dấu phân cách giữa tất cả các phần tử: ví dụ: a, b, c

$đầu tiên = đúng; foreach ($items as $item) ( $str = ($first)?$first=false:", ".$item; )

$page_comment): ?>

Khi toEnd về 0, điều đó có nghĩa là nó đang ở lần lặp cuối cùng của vòng lặp.

$toEnd = đếm($arr); foreach($arr as $key=>$value) ( ​​​​if (0 === --$toEnd) ( echo "last index! $value"; ) )

Giá trị cuối cùng vẫn có sẵn sau vòng lặp, vì vậy nếu bạn chỉ muốn sử dụng nó cho nhiều thứ hơn sau vòng lặp thì điều này tốt hơn:

Foreach($arr as $key=>$value) ( ​​//something ) echo "last index! $key => $value";

Nếu bạn không muốn coi giá trị cuối cùng là các vòng lặp bên trong đặc biệt. Điều này sẽ nhanh hơn nếu bạn có mảng lớn. (Nếu bạn đang sử dụng lại một mảng sau một vòng lặp trong cùng một phạm vi, trước tiên bạn cần "sao chép" mảng đó).

//Nếu bạn sử dụng mã này trong một mã toàn cầu lớn không có không gian tên hoặc hàm thì bạn có thể sao chép mảng như thế này: //$array = $originArrayName; //bỏ ghi chú để sao chép một mảng bạn có thể sử dụng sau vòng lặp này //end($array); $lastKey = key($array); //bỏ ghi chú nếu bạn sử dụng các phím $lastValue = array_pop($array); // làm điều gì đó đặc biệt với giá trị cuối cùng ở đây trước khi bạn xử lý tất cả những giá trị khác? echo "Cuối cùng là $lastValue", "\n"; foreach ($array as $key => $value) ( ​​//làm điều gì đó với tất cả các giá trị trước giá trị cuối cùng echo "Tất cả ngoại trừ giá trị cuối cùng: $value", "\n"; ) //làm điều gì đó đặc biệt với giá trị cuối cùng ở đây sau khi bạn xử lý tất cả những giá trị khác? echo "Cuối cùng là $lastValue", "\n";

Và để trả lời câu hỏi ban đầu của bạn "trong trường hợp của tôi, hãy thêm tham số or/and khi xây dựng truy vấn"; điều này sẽ bao gồm tất cả các giá trị và sau đó nối chúng thành một chuỗi có "và" ở giữa chúng, nhưng không phải trước giá trị đầu tiên hoặc sau giá trị cuối cùng:

$params = ; foreach ($array as $value) ( ​​$params = doSomething($value); ) $parameters = implode(" và ", $params);

Bạn vẫn có thể sử dụng phương pháp này với mảng kết hợp:

$keys = array_keys($array); với ($i = 0, $l = count($array); $i< $l; ++$i) { $key = $array[$i]; $value = $array[$key]; $isLastItem = ($i == ($l - 1)); // do stuff } // or this way... $i = 0; $l = count($array); foreach ($array as $key =>$value) ( ​​$isLastItem = ($i == ($l - 1)); // làm công việc ++$i; )

Một cách khác là ghi nhớ kết quả trước đó của vòng lặp và sử dụng nó làm kết quả cuối cùng:

$kết quả = $where = ""; foreach ($conditions as $col => $val) ( $result = $where .= $this->getAdapter()->quoteInto($col." = ?", $val); $where .= " AND " ; ) trả về $this->delete($result);

Cá nhân tôi sử dụng một thiết kế như thế này để dễ dàng sử dụng các phần tử html

  • : Chỉ cần thay đổi đẳng thức cho thuộc tính khác...

    Một mảng không thể chứa các phần tử sai, nhưng tất cả các phần tử khác đều được chuyển đến giá trị boolean sai.

    $table = array("a", "b", "c"); $it = đặt lại ($bảng); while($it !== false) ( echo "all loops";echo $it; $nextIt = next($table); if ($nextIt === false || $nextIt === $it) ( echo " vòng lặp cuối cùng hoặc hai mục giống hệt nhau"; ) $it = $nextIt; )

    Bạn có thể trực tiếp lấy chỉ mục mới nhất:

    $numItems = đếm($arr);

    echo $arr[$numItems-1];

    Giả sử bạn có một mảng được lưu trữ trong một biến...

    Foreach($array as $key=>$value) ( ​​​​echo $value; if($key != count($array)-1) ( echo ", "; ) )

    Có vẻ như bạn muốn một cái gì đó như thế này:

    $array = array("Đầu tiên", "Thứ hai", "Thứ ba", "Cuối cùng"); foreach($array as $key => $value) ( ​​​​if(end($array) === $value) ( ​​​​echo "last index!" . $value; ) )

    Nếu bạn cần làm gì đó cho mọi phần tử ngoại trừ phần tử đầu tiên hoặc phần tử cuối cùng và chỉ khi có nhiều hơn một phần tử trong mảng, tôi thích giải pháp sau.

    Tôi biết có nhiều giải pháp ở trên và được đăng trước tôi hàng tháng/năm, nhưng đây là điều tôi cảm thấy khá thanh lịch. Kiểm tra từng vòng lặp cũng là kiểm tra logic, trái ngược với kiểm tra số "i = (count-1)", có thể giảm chi phí.

    Cấu trúc vòng lặp có vẻ khó xử, nhưng bạn có thể so sánh nó với thứ tự của các thẻ (bắt đầu), tfoot (kết thúc), tbody (hiện tại) trong bảng HTML.

    $đầu tiên = đúng; foreach($array as $key => $value) ( ​​​​if ($first) ( $first = false; // Thực hiện những gì bạn muốn làm trước phần tử đầu tiên echo "Danh sách các cặp khóa, giá trị:\n" ; ) else ( // Làm những gì bạn muốn làm ở cuối mỗi phần tử // ngoại trừ phần tử cuối cùng, giả sử danh sách có nhiều hơn một phần tử echo "\n"; ) // Làm những gì bạn muốn làm cho hiện tại phần tử echo $key . " => " . $value; )

    Ví dụ: trong thuật ngữ phát triển web, nếu bạn muốn thêm border-bottom cho mọi phần tử ngoại trừ phần tử cuối cùng trong danh sách không có thứ tự (ul) thì thay vào đó bạn có thể thêm border-top cho mọi phần tử ngoại trừ phần tử đầu tiên(CSS:first-child, được hỗ trợ bởi IE7+ và Firefox/Webkit, hỗ trợ logic này, trong khi:last-child không được IE7 hỗ trợ).

    Bạn có thể thoải mái sử dụng lại biến $first cho mỗi vòng lặp lồng nhau và mọi thứ sẽ hoạt động tốt vì mỗi vòng lặp tạo ra $first sai trong quá trình đầu tiên của lần lặp đầu tiên (vì vậy, việc ngắt/ngoại lệ sẽ không gây ra sự cố).

    $đầu tiên = đúng; foreach($array as $key => $subArray) ( if ($first) ( $string = "Danh sách các cặp khóa => giá trị mảng:\n"; $first = false; ) else ( echo "\n"; ) $string .= $key . "=>("; $first = true; foreach($subArray as $key => $value) ( ​​​​if ($first) ( $first = false; ) else ( $string .= ", "; ) $string .= $key . "=>" . $value; ) $string .= ")"; ) echo $string;

    Đầu ra ví dụ:

    Danh sách các cặp mảng key => value: key1=>(v1_key1=>v1_val1, v1_key2=>v1_val2) key2=>(v2_key1=>v2_val1, v2_key2=>v2_val2, v2_key3=>v2_val3) key3=>(v3_key1=>v3_val1 )

    Một cách có thể là phát hiện vòng lặp tiếp theo. Nếu không có phần tiếp theo trên trình vòng lặp, điều đó có nghĩa là bạn đang ở vòng lặp cuối cùng.

    Foreach ($some_array as $element) ( if(!next($some_array)) ( // Đây là $element cuối cùng ) )

    Vì vậy, nếu mảng của bạn có các giá trị mảng duy nhất thì việc xác định lần lặp cuối cùng là chuyện nhỏ:

    Foreach($array as $element) ( if ($element === end($array)) echo "LAST ELEMENT!"; )

    Như bạn có thể thấy, điều này có hiệu quả nếu phần tử cuối cùng chỉ xuất hiện một lần trong mảng, nếu không bạn sẽ nhận được cảnh báo sai. Trong phần này, không, bạn cần so sánh các khóa (tất nhiên là duy nhất).

    Foreach($array as $key => $element) ( end($array); if ($key === key($array)) echo "LAST ELEMENT!"; )

    Cũng lưu ý toán tử liên hệ nghiêm ngặt, điều này khá quan trọng trong trường hợp này.

    Đây là giải pháp của tôi: chỉ cần lấy bộ đếm của mảng của bạn, trừ 1 (bắt đầu từ 0).

    $lastkey = count($array) - 1; foreach($array as $k=>$a)( if($k==$lastkey)( /*do something*/ ) )

    Có vẻ như bạn muốn một cái gì đó như thế này:

    $numItems = đếm($arr); $i = 0; foreach($arr as $key=>$value) ( ​​​​if(++$i === $numItems) ( echo "last index!"; ) )

    Nói như vậy, bạn không muốn - lặp lại một "mảng" bằng cách sử dụng foreach trong php.

    Đã có nhiều câu trả lời, nhưng cũng đáng để xem xét các trình vòng lặp, đặc biệt vì nó được yêu cầu theo cách tiêu chuẩn:

    $arr = phạm vi (1, 3); $it = new CachingIterator(new ArrayIterator($arr)); foreach($it as $key => $value) ( ​​​​ if (!$it->hasNext()) echo "Last:"; echo $value, "\n"; )

    Bạn có thể tìm thấy thứ gì đó giúp nó linh hoạt hơn cho các trường hợp khác.

    Lỗi nghiêm trọng: Gọi hàm thành viên... trên một đối tượng không phải

    Xảy ra với mã tương tự như xyz->method() trong đó xyz không phải là một đối tượng và do đó phương thức này không thể được gọi.

    Đây là một lỗi nghiêm trọng sẽ dừng tập lệnh (thông báo về khả năng tương thích về phía trước: điều này sẽ trở thành một lỗi bắt bắt đầu từ PHP 7).

    Thông thường, đây là dấu hiệu cho thấy mã thiếu tính năng kiểm tra lỗi. Xác nhận rằng một đối tượng thực tế là một đối tượng trước khi gọi các phương thức của nó.

    một ví dụ điển hình sẽ là

    // ... một số mã sử dụng PDO $statement = $pdo->prepare("truy vấn không hợp lệ", ...); $statement->execute(...);

    Trong ví dụ trên, yêu cầu không thể được chuẩn bị và prepare() gán false cho $statement . Việc cố gắng gọi phương thức exec() sẽ dẫn đến Lỗi nghiêm trọng vì false là "không phải đối tượng" vì giá trị là boolean.

    Tìm ra Tại sao hàm của bạn trả về giá trị boolean thay vì một đối tượng. Ví dụ: kiểm tra đối tượng $pdo để biết lỗi cuối cùng đã xảy ra. Chi tiết về cách gỡ lỗi này sẽ phụ thuộc vào cách xử lý lỗi đối với hàm/đối tượng/lớp cụ thể.

    Ngay cả khi ->prepare không thành công, cơ sở dữ liệu của bạn xử lý $pdo không nằm trong phạm vi hiện tại. Tìm nơi anh quyết định. Sau đó chuyển nó dưới dạng tham số, lưu trữ dưới dạng thuộc tính hoặc chia sẻ nó qua phạm vi toàn cầu.

    Một vấn đề khác có thể là tạo một đối tượng có điều kiện và sau đó cố gắng gọi một phương thức bên ngoài khối điều kiện đó. Ví dụ

    If ($someCondition) ( $myObj = new MyObj(); ) // ... $myObj->someMethod();

    Bằng cách cố gắng thực thi một phương thức bên ngoài khối điều kiện, đối tượng của bạn không thể được xác định.

    Câu hỏi liên quan:

    • Gọi hàm thành viên trên một phi đối tượng
    • Danh sách tất cả các câu hỏi PHP "Lỗi nghiêm trọng: Gọi hàm thành viên... không phải đối tượng"

    PHP đầy hứa hẹn và hiện đại: cú pháp chất lượng cao và khả năng thực hiện ngữ nghĩa vượt xa những gì được phép. Việc thực hiện các ý tưởng lập trình hướng đối tượng và quyền tự do thay đổi loại biến sẽ biến những tưởng tượng điên rồ nhất của bạn thành hiện thực.

    Mảng là một thiết kế cổ xưa và các mảng liên kết mang tính tôn vinh thời đại hơn là một yêu cầu thực hành. Mặc dù có đủ số lượng nhiệm vụ liên quan đến việc tạo các bộ sưu tập dữ liệu có nội dung không được xác định trước (số lượng, giá trị, loại và chỉ mục), có sẵn để xem và sử dụng trong các vòng lặp. bất kỳ phương pháp sáng tạo nào. Mảng - thông thường và kết hợp - cho phép bạn tạo danh sách, nhưng trong cú pháp PHP thông thường, điều này bị hạn chế sử dụng.

    Giá trị mảng hiện tại

    Nếu chúng ta trừu tượng hóa khỏi các chỉ mục và sử dụng cấu trúc

    $arData = scField mới(); // scNumber, scString, scParagraph, ...

    trong đó scField() là hàm tạo của một đối tượng trừu tượng - một “phần tử thông tin” có các con cháu: số (scNumber), chuỗi (scString), cụm từ (scParagraph), ... chúng ta có trong PHP: phần tử cuối cùng = một mảng của các đối tượng thể hiện các thuộc tính của nó như là phần tử thực tế.

    Về cơ bản, phần tử nào được coi là có liên quan không quan trọng, nhưng trong trường hợp này, bạn sẽ phải theo dõi con trỏ (trong PHP - một con trỏ) bên trong mảng. Thường xuyên hơn, bạn cần có con trỏ phần tử của riêng mình. Không cần có con trỏ trong ý tưởng "phần tử cuối cùng = mảng" của PHP. Có thể truy cập thông qua các hàm end() và array_pop(), phần tử cuối cùng ủy quyền các thuộc tính của nó cho mảng. Ngoài ra, việc sử dụng array_pop() sẽ tự động đưa mảng về phần tử trước đó và các thuộc tính của nó thay đổi tương ứng. Điều này làm cho nó có thể di chuyển qua các yếu tố.

    Vì vậy, đặt cú pháp PHP vào ngữ cảnh, việc truy xuất phần tử cuối cùng của mảng thực sự có nghĩa là sử dụng các thuộc tính của nó. Một cách nhất quán, bằng cách đặt và loại bỏ các phần tử, chúng ta có được động lực học của các thuộc tính, động lực học của một thuộc tính mới được hình thành trong giới hạn của cú pháp có sẵn.

    Yếu tố đầu tiên và các yếu tố khác

    Có các hàm để làm việc với phần tử đầu tiên của mảng và di chuyển con trỏ bên trong. Trong cú pháp thông thường thực hiện thực hành lập trình cổ điển, chúng có thể áp dụng được. Về việc tạo mảng có ý nghĩa thay đổi linh hoạt - không.

    Trong lập trình, chúng ta luôn nói về việc đưa ra quyết định: các biến nhận giá trị, các câu lệnh điều kiện thay đổi tiến trình của thuật toán, các vòng lặp phân tích một cái gì đó và cuối cùng là tạo ra một kết quả.

    Nếu bạn chuyển trọng tâm sang chính phần tử đó và để nó tự đưa ra quyết định, thì việc triển khai chương trình sẽ có một diện mạo hoàn toàn khác và có ý nghĩa. Thông thường, đây là phương pháp cho phép bạn đạt được mục tiêu, đặc biệt là khi sử dụng nhiều thẻ tài liệu *.docx được viết theo tiêu chuẩn Open XML.

    Trong PHP, việc lấy phần tử cuối cùng của mảng có ý nghĩa mới và những khả năng tốt.

    Đang tải tập tin và động lực của thuộc tính mảng

    Khi một trang web cung cấp khả năng tải xuống bất kỳ tệp nào, sẽ rất thuận tiện khi sử dụng ý tưởng về một đối tượng trừu tượng, ví dụ: scFile và các hậu duệ của nó scImage, scDocument, scTabe, sẽ có cùng các thuộc tính, nhưng cách biểu hiện và cách biểu hiện khác nhau của chúng. ý nghĩa (nội dung). Trong ngữ cảnh cú pháp PHP (phần tử cuối cùng = mảng), bằng cách sử dụng hàm end(), bạn có thể sử dụng nó làm phần tử cuối cùng được xác định. Giải pháp này rất thú vị vì nó đảo ngược các cách biểu diễn thông thường và cho phép bạn điều hướng qua cấu trúc dữ liệu khi nó được hình thành.

    Việc sử dụng mảng này mang lại cho họ nội dung hoàn toàn mới. Điều này được cung cấp bởi cú pháp PHP, nhưng sử dụng nó theo cách này sẽ mở ra rất nhiều khả năng.

    Đã cung cấp các phương pháp trực quan hóa, lưu vào cơ sở dữ liệu, khôi phục về trạng thái hoạt động (ví dụ), bạn sẽ không phải suy nghĩ phải làm gì trong một trường hợp cụ thể. Tất cả các tệp đã tải xuống được đặt trong mảng một cách tuần tự và khi nó được xử lý, các phương thức tương tự luôn được gọi theo cùng một sơ đồ, nhưng tệp hình ảnh sẽ được hiển thị nguyên trạng, tệp bảng tính sẽ được hiển thị dưới dạng bảng và tài liệu sẽ được hiển thị dưới dạng văn bản tương ứng. Có thể truy cập thông qua cú pháp PHP, phần tử cuối cùng của mảng được trang bị các thuộc tính và nội dung cụ thể của nó.

    Trong trường hợp sau, tài liệu luôn có các ký tự, dòng, số và quan trọng nhất là định dạng. Việc theo dõi từng thành phần là khó khăn, nhưng bằng cách cung cấp đối tượng thích hợp cho từng thành phần định dạng, bạn có thể nhận được tài liệu nguyên trạng mà không cần suy nghĩ.

    Ngăn xếp và đệ quy theo cú pháp

    Khi chỉ làm việc với phần tử cuối cùng, điều kiện chính là ngăn xếp, nhưng khi phần tử này được thực thi và sử dụng cùng một cấu trúc trong đó, và đặc biệt là chính nó, thì đó là đệ quy. Bạn có thể nói rất nhiều điều hay về các thư viện PHPOffice, chẳng hạn như PHPWord, nhưng không thể nói rằng chúng thực hiện một cơ chế chính thức để dịch định dạng tài liệu nguồn thành kết quả.

    Thật vậy, bằng cách sử dụng PHPOffice\PHPWord, bạn có thể chỉ cần mở bất kỳ tài liệu Word nào (*.docx), nhưng đây chỉ là một kho lưu trữ của nhiều tệp xml, hình ảnh, đối tượng có cấu trúc, v.v.

    Đồng thời, nếu bạn chỉ lấy các tệp xml, mặc dù chúng có liên quan với nhau (về kiểu, bảng, hình ảnh), sẽ không thể tạo tài liệu mới dựa trên tài liệu cũ và chỉ cần chuyển các thay đổi mong muốn sang tài liệu đó. (ví dụ: thay đổi phông chữ, màu sắc, định dạng). Có nhiều tùy chọn để sử dụng thẻ Open XML và ngay cả một sản phẩm hoạt động tốt như MS Word không phải lúc nào cũng đáp ứng được ý tưởng của người dùng và mắc lỗi.

    Trên thực tế, tệp *.docx là một kho lưu trữ zip, có cấu trúc rõ ràng và dễ hiểu. Bằng cách sử dụng một số lượng nhỏ các đối tượng, bạn có thể mô tả nó một cách chính thức và thu được, tại thời điểm đọc, một cấu trúc dữ liệu độc lập, đầy đủ, có thể được thao tác về mặt ngữ nghĩa.

    Trong trường hợp này, thông tin trong tài liệu là cấu trúc dữ liệu hình thức. Bằng cách tạo cho nó sự năng động, bạn có thể dễ dàng chuyển sang cấp độ ý nghĩa và trừu tượng từ cú pháp.

    Reg.ru: tên miền và lưu trữ

    Nhà đăng ký và cung cấp dịch vụ lưu trữ lớn nhất ở Nga.

    Hơn 2 triệu tên miền đang được sử dụng.

    Khuyến mãi, mail tên miền, giải pháp kinh doanh.

    Hơn 700 nghìn khách hàng trên khắp thế giới đã đưa ra lựa chọn của mình.

    Khung Bootstrap: bố cục thích ứng nhanh

    Khóa học video từng bước về kiến ​​thức cơ bản về bố cục thích ứng trong khung Bootstrap.

    Học cách sắp chữ một cách đơn giản, nhanh chóng và hiệu quả bằng cách sử dụng một công cụ mạnh mẽ và thiết thực.

    Bố trí để đặt hàng và được trả tiền.

    * Di chuột qua để tạm dừng cuộn.

    Quay lại phía trước

    PHP: Loại bỏ các phần tử mảng

    Chúng ta phải đối mặt với một nhiệm vụ có vẻ tầm thường: loại bỏ một phần tử mảng. Hoặc một số yếu tố.

    Tuy nhiên, vì sự đơn giản của nó, có những tùy chọn không hoàn toàn rõ ràng và đáng để biết nếu bạn muốn nâng cao PHP hơn một chút so với "Xin chào, thế giới!" :)

    Hãy bắt đầu với chính cơ sở: để loại bỏ một phần tử, bạn cần sử dụng hàm bỏ đặt():

    Bỏ đặt ($ mảng); unset($array["foo"]);

    Unset($array, $array); unset($array["foo"], $array["bar"]);

    Câu hỏi hợp lý tiếp theo là: làm thế nào để xóa nhiều phần tử nối tiếp nhau (tức là liền kề)? Để loại bỏ nhiều phần tử liền kề, hãy sử dụng hàm mảng_splice():

    Mảng_splice($array, $offset, $length);

    Xin lưu ý rằng khi sử dụng các hàm này, tất cả các tham chiếu đến các phần tử này sẽ biến mất. Nếu bạn muốn để lại một khóa trong mảng nhưng liên kết nó với một giá trị trống, hãy gán phần tử mong muốn vào một chuỗi trống:

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

    Điều quan trọng là phải hiểu rằng chức năng bỏ đặt() loại bỏ phần tử, trong khi gán "" cho phần tử không loại bỏ phần tử đó mà làm cho giá trị của nó bằng chuỗi trống.

    Nếu bạn làm việc với các con số, có lẽ sẽ tốt hơn nếu kết hợp giá trị 0 với một khóa như vậy.

    Giả sử, nếu một công ty đã ngừng sản xuất các bộ phận cho mẫu HBL-568 thì có thể thực hiện thay đổi đối với mảng bộ phận:

    Unset($products["HBL-568"]);

    Nếu bộ phận HBL-568 chỉ tạm thời không có trong kho và dự kiến ​​sẽ được chuyển đến từ nhà máy, thì tốt hơn hết bạn nên làm khác:

    $products["HBL-568"] = 0;

    Điểm tiếp theo cần hiểu là khi gọi một hàm bỏ đặt()đối với phần tử mảng, PHP điều chỉnh mảng sao cho vòng lặp vẫn hoạt động chính xác.

    Nói cách khác, mảng không được nén để lấp đầy các “lỗ hổng” được tạo ra. Về cơ bản, điều này có nghĩa là tất cả các mảng đều có tính kết hợp, ngay cả khi thoạt nhìn chúng có vẻ là số. Hãy xem xét các ví dụ rõ ràng để minh họa hành vi này:

    // Tạo một mảng "số" $animals = array("ant", "bee", "cat", "dog", "elk", "fox"); in $động vật; // In "bee" print $animals; // In ra số đếm "mèo"($animals); // Trả về 6 // unset() unset($animals); // Loại bỏ một phần tử $animals = "bee" print $animals; // Không xuất ra bất cứ thứ gì và báo lỗi E_NOTICE print $animals; // In ra số đếm "mèo"($animals); // Trả về 5 trong khi phần tử $array vẫn giữ nguyên vị trí và chứa "fox" // Thêm phần tử mới $animals = "gnu"; // Thêm một phần tử mới print $animals; // Không in gì cả, còn báo lỗi E_NOTICE print $animals; // In "gnu" count($animals); // Trả về 6 // Gán "" (chuỗi trống) $animals = ""; // Đặt thành "chuỗi trống" print $animals; // In "" count($animals); // Trả về 6, tức là tính đến phần tử mảng trống khi đếm

    Để truy cập vào một mảng số có mật độ dân cư đông đúc, hãy sử dụng hàm mảng_values():

    $animals = array_values($animals);

    Ngoài ra, hàm array_splice() sẽ tự động lập chỉ mục lại các mảng để loại bỏ các “lỗ hổng”:

    // Tạo một mảng "số" $animals = array("ant", "bee", "cat", "dog", "elk", "fox"); mảng_splice($animals, 2, 2); print_r($động vật);

    Ở đầu ra, chúng tôi nhận được:

    Mảng ( => kiến ​​=> ong ​​=> nai sừng tấm => cáo)

    Tính năng này có thể hữu ích ở đâu?

    Giả sử bạn đang làm việc với một mảng dưới dạng hàng đợi và muốn xóa các phần tử khỏi hàng đợi này mà không làm mất khả năng truy cập ngẫu nhiên, khi bạn có thể vô tình rơi vào một trong các "lỗ hổng" tạo ra.

    Và cuối cùng, để loại bỏ phần tử đầu tiên hoặc cuối cùng khỏi mảng một cách an toàn, các hàm mảng_shift()mảng_pop() tương ứng.

    Mọi thứ đều rất đơn giản với họ:

    $stack = array("cam", "chuối", "táo", "mâm xôi"); $fruit = array_shift($stack); print_r($stack);

    Kết quả của việc thực thi đoạn mã trên, chúng ta sẽ nhận được kết quả đầu ra sau:

    Mảng ( => chuối => táo => mâm xôi)

    Để loại bỏ phần tử cuối cùng, hãy sử dụng hàm mảng_pop():

    $stack = array("cam", "chuối", "táo", "mâm xôi"); $fruit = array_pop($stack); print_r($stack);

    Đầu ra là bản in mảng sau:

    Mảng ( => cam => chuối => táo)

    Đó là tất cả. Chúng ta đã thảo luận những điểm chính về việc xóa các phần tử mảng trong PHP. Nếu có bất cứ điều gì xảy ra, tài liệu chính thức luôn hữu ích.

    Bạn có thích tài liệu này và muốn cảm ơn tôi không?
    Chỉ cần chia sẻ với bạn bè và đồng nghiệp của bạn!


    Xem thêm:

    Mảng PHP được sử dụng ở mọi nơi. Việc thêm và thay đổi giá trị thường đơn giản.

    Loại bỏ các phần tử mảng là một thao tác đặc biệt. Bạn có thể chỉ cần xóa phần tử đó hoặc bạn có thể xóa nó và sử dụng nó. Sắc thái này mang đến những cơ hội tuyệt vời.

    Mảng PHP

    PHP là ngôn ngữ lập trình hiện đại, chức năng làm việc với mảng được thực hiện ở mức cao. Lập trình viên có cơ hội sử dụng các mảng thông thường và mảng kết hợp, thiết kế cấu trúc dữ liệu đa chiều và có bất kỳ giá trị nào dưới dạng các phần tử mảng.

    Có một bộ hàm được phát triển để làm việc với mảng và các cấu trúc cú pháp đặc biệt. Có thể duyệt mảng bằng thuật toán của riêng bạn và gán các hàm xử lý của riêng bạn.

    Ví dụ về tạo và sử dụng mảng

    Chức năng scPrint là chức năng phụ trợ. Nó viết đệ quy một mảng thành một chuỗi ký tự để minh họa kết quả mà nó tạo ra.

    Mảng $aFruits được tạo theo cách thông thường: các giá trị được liệt kê, các chỉ mục được gán tự động từ đầu. Dấu phẩy cuối cùng không liên quan và không tạo ra phần tử trống khác.

    Mảng $aData được tạo trống, sau đó các giá trị được thêm vào mảng đó. Ba là tự động và hai là có chỉ mục kết hợp không ảnh hưởng đến việc đánh số tổng thể các giá trị. Do đó, các phần tử “mận” và “đào” lần lượt có các chỉ số “mới” và “tươi”.

    Mảng $aInfo có tính đa chiều và liên kết.

    Ba thao tác xóa chỉ ra cách xóa một phần tử trong mảng PHP.

    Thao tác đầu tiên loại bỏ phần tử thứ hai khỏi mảng $aFruits, chỉ số của nó là 1. Cần lưu ý rằng các chỉ số sau không bị dịch chuyển, điều đó có nghĩa là trong các thao tác tuần hoàn với mảng như vậy cần kiểm tra sự tồn tại của phần tử .

    Thao tác thứ hai xóa phần tử cuối cùng và đầu tiên trong mảng $aData, xác nhận rằng việc xóa không ảnh hưởng đến chỉ mục và khả năng xóa đồng thời một số phần tử.

    Cái thứ ba xóa một mảng trong một mảng và một phần tử trong mảng là một phần của mảng khác.

    Loại bỏ các phần tử thông thường - không đặt

    Chức năng không đặt sẽ loại bỏ. Không có vấn đề gì. Nó chỉ có thể là một biến hoặc một phần tử mảng. unset() được coi là toán tử ngôn ngữ, không phải là hàm. Toán tử này không trả về bất kỳ giá trị nào và nó "hủy" những gì được truyền cho nó dưới dạng tham số. Biến hoặc mảng biến mất như thể nó chưa từng tồn tại.

    Trong PHP, bạn có thể loại bỏ các phần tử mảng trống theo nhiều cách khác nhau; trên thực tế, cái gì được coi là phần tử trống phụ thuộc vào người lập trình. Tuy nhiên, sẽ không khôn ngoan lắm khi sử dụng nhiều tham số trong toán tử unset() cho mục đích này. Sẽ thực tế hơn nếu chuyển các hoạt động nhóm thành các chức năng nhóm.

    Máy tính hiện đại rất nhanh và PHP rất nhanh. Nhưng đây không phải là lý do để tạo và xử lý hàng tấn thông tin bằng các thuật toán rườm rà; đây là lý do khách quan để tiếp cận quá trình loại bỏ các phần tử mảng theo những cách lũy tiến.

    Xóa phần tử bằng phương thức chuỗi

    Trong PHP, bạn có thể loại bỏ hàng loạt phần tử mảng trống bằng cách chuyển đổi mảng thành chuỗi và trả về. Nhưng trường hợp này chỉ phù hợp với các phần tử thực sự trống, thiếu chỉ mục hoặc nhằm mục đích lập chỉ mục lại một mảng.

    Khái niệm phần tử trống phụ thuộc vào nhiệm vụ. Thông thường, một phần tử mảng hiện có chứa thông tin nhất định sẽ trở nên trống rỗng. Ví dụ: một mảng ghi lại khách truy cập. Phần tử mảng chứa:

    • thời gian đến của du khách;
    • chế độ hoạt động hiện tại;
    • trang hoạt động;
    • lần hành động cuối cùng.

    Nếu chênh lệch giữa thời gian đến và thời gian của hành động cuối cùng lớn hơn 1 phút (hoặc giá trị khác), chúng tôi có thể cho rằng khách hàng đã rời khỏi trang web. Hồ sơ về những khách hàng như vậy có thể bị xóa nếu nhiệm vụ là giám sát danh sách khách truy cập đang hoạt động và không sử dụng các phương pháp nâng cao hơn bằng JavaScript.

    Tuy nhiên, việc xử lý "dòng" là tốt. Ví dụ: trong PHP bạn có thể loại bỏ các phần tử mảng trùng lặp như thế này:

    Cách nhanh chóng và giá cả phải chăng. Không nhất thiết phải sử dụng ký hiệu “[” và “]” để biểu thị từng phần tử, nhưng hãy nhớ rằng khi chuyển đổi một mảng thành chuỗi, bạn phải đảm bảo rằng mỗi phần tử là duy nhất. Các ký tự đóng khung phải được chọn dựa trên các ký tự được phép có trong phần tử. Một quy tắc không thể lay chuyển: mỗi phần tử mảng trong một hàng là duy nhất và có vị trí của nó (nếu không thì không thể trả lại thứ gì).

    Phương pháp này thuận tiện hơn khi nhiệm vụ trong PHP là loại bỏ một phần tử mảng theo giá trị. Bạn có thể sử dụng hàm array_flip và hoán đổi các giá trị cũng như khóa, sau đó thực hiện thao tác hủy đặt cổ điển. Bạn có thể sử dụng hàm array_search và tìm khóa của giá trị bạn muốn xóa. Nhưng phiên bản chữ thường của giải pháp rõ ràng và đơn giản hơn.

    PHP thực tế không giới hạn nhà phát triển về bất cứ điều gì: cả về số lượng kích thước cũng như kích thước của các phần tử. Không có ý nghĩa gì khi tham gia vào việc này. Mỗi phần tử phải có độ dài tối thiểu có thể và số lượng kích thước sẽ có xu hướng là một.

    Nếu số chiều của mảng lớn hơn ba thì đây là lý do chính đáng để xem xét lại quyết định. Nếu một phần tử mảng dài hơn 4000-8000 ký tự, sẽ nảy sinh nghi ngờ về tính hợp lý của bức tranh dữ liệu được xây dựng.

    Ý kiến ​​​​này không xuất phát từ bối cảnh chức năng của mảng PHP: loại bỏ một phần tử, thêm một đối tượng thuộc loại khác, thay đổi một thứ thành một thứ hoàn toàn khác. Sự đơn giản là chìa khóa thành công không chỉ trong cuộc sống mà còn trong thuật toán. Chương trình sẽ hoạt động và không gây ngạc nhiên với quy mô, quy mô và quy mô ý tưởng của nó. Quan trọng là kết quả chứ không phải ý tưởng lớn.

    Là ngôn ngữ lập trình hiện đại, PHP không bỏ qua đệ quy và ngăn xếp. Về cơ bản, ý nghĩa của lập trình viên không quan trọng khi anh ta sử dụng hàm array_pop() trong PHP: loại bỏ phần tử cuối cùng của mảng hoặc đơn giản là đưa nó vào một biến nào đó.

    Nhưng hãy nhớ rằng trong ngữ cảnh này, hàm array_pop là một hàm push & pop, tức là nó là một công cụ ngăn xếp chứ không phải một công cụ xóa.

    Ở đây người ta thường nói không phải là "xóa" mà là "trích xuất". Các ngữ nghĩa là khác nhau đáng kể. Tuy nhiên, hàm array_shift() trong PHP - loại bỏ phần tử đầu tiên của mảng hoặc trích xuất nó - có một hàm ý khác. Ở đây, phần tử cũng được truy xuất vào một biến ngoài và sẽ không có trong mảng nhưng các chỉ số sẽ được dịch chuyển.

    Khi phần tử đầu tiên được trích xuất từ ​​một mảng, tất cả các phần tử theo sau nó sẽ được dịch chuyển về phía trước, nhưng chỉ các chỉ số số thay đổi; các chỉ số chữ thường không thay đổi.

    Xóa hoặc thay đổi: lịch sử giao dịch

    Một biến đã có từ rất lâu rồi, một mảng đã có từ rất lâu rồi, một đồ vật là ngày hôm qua. Lập trình hướng đối tượng vẫn chỉ được nói đến chứ chưa phát huy được hết tiềm năng của nó. Hiếm khi các giải pháp hời hợt lại trở thành chủ đề của các giải pháp tâm huyết và hệ thống quản lý nội dung (CMS) “khôn ngoan” với nhiều “nội dung”.

    Quy tắc khách quan: vấn đề không phải là số lượng mã mà là chất lượng của nó! Nhưng chưa có CMS hiện đại nào chú ý đến quy tắc này. Các tác giả của nó tin rằng họ đang làm điều đúng đắn và biết họ đang làm gì.

    Kết quả (tính năng đặc trưng): không có CMS hiện đại nào được phân biệt bằng một “hình dáng” đàng hoàng (độ mảnh mai và nhẹ nhàng của thiết kế), tất cả đều có mức độ hoàn thiện cao về mã, mỗi thứ đều yêu cầu sự tôn trọng:

    • lập trình viên có trình độ cao;
    • cần cài đặt;
    • áp đặt các yêu cầu lưu trữ;
    • gây khó khăn khi chuyển sang hosting khác;
    • thực sự làm chậm công việc và quản lý.

    Các lập trình viên đã đến với khái niệm rollback từ rất lâu; lập trình hiện đại không thể tưởng tượng việc tạo ra phần mềm mà không có hai chức năng:

    • Hoàn tác;
    • làm lại.

    Sai lầm không chỉ là bản chất của con người mà trong mọi tình huống đều phải có sự rút lui. Trong các công cụ lập trình Internet hiện đại cho đến ngày nay, điểm này không những không còn quan trọng mà còn được sử dụng ở quy mô rất hạn chế.

    Các thao tác PHP trên một mảng: loại bỏ một phần tử, thay đổi kiểu của nó hoặc thêm một cái gì đó mới đều rõ ràng. Nhưng trước khi có biến, rồi mảng, rồi đối tượng. Không có lý do gì để nghĩ về thực tế rằng mảng chỉ là một biến theo thời gian?

    Mảng là một cấu trúc dữ liệu theo thời gian. Không có ngôn ngữ nào cho đến ngày nay coi thời gian là một yếu tố trong cú pháp. Bạn thậm chí không cần phải nói về ngữ nghĩa: từ xa xưa cho đến ngày nay, các lập trình viên và người dùng chỉ hiểu các tập tin và thư mục. Ví dụ, sự phát triển đã đạt đến mức tối đa trong PHP, không gian tên được phản ánh một cách tầm thường trong cấu trúc của các thư mục và tệp.

    Trong ngữ cảnh này, các hành động tầm thường trong PHP trên một mảng: xóa một phần tử, thay đổi hoặc thêm - yêu cầu các hành động bổ sung từ lập trình viên. Bạn có thể để mọi thứ như cũ và nó sẽ diễn ra như mọi khi. Bạn có thể tính đến mọi thao tác trên dữ liệu và ghi lại đầy đủ, tạo và lưu trữ lịch sử thao tác.

    Đây sẽ là một mức độ công việc hoàn toàn khác và chất lượng kết quả hoàn toàn tốt hơn.