Kiểm tra xem tất cả các mục mảng có trống PHP không


81

Tôi đang thêm một mảng các mục từ một biểu mẫu và nếu tất cả chúng đều trống, tôi muốn thực hiện một số xác thực và thêm vào một chuỗi lỗi. Vì vậy, tôi có:

$array = array(
    'RequestID'       => $_POST["RequestID"],
    'ClientName'      => $_POST["ClientName"],
    'Username'        => $_POST["Username"],
    'RequestAssignee' => $_POST["RequestAssignee"],
    'Status'          => $_POST["Status"],
    'Priority'        => $_POST["Priority"]
);

Và sau đó nếu tất cả các phần tử của mảng đều trống, hãy thực hiện:

$error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';

5
Đối với bất kỳ ai đang đọc điều này mà đang bối rối, đừng đặt $ _POST trong dấu ngoặc kép - nó sẽ không được đánh giá!
Jamie

2
Tôi đã tự do chỉnh sửa các trích dẫn đi.
xtofl

Câu trả lời:


176

Bạn chỉ có thể sử dụng array_filter tích hợp sẵn

Nếu không có lệnh gọi lại nào được cung cấp, tất cả các mục nhập bằng FALSE (xem chuyển đổi thành boolean) sẽ bị xóa.

Vì vậy, có thể làm điều này trong một dòng đơn giản.

if(!array_filter($array)) {
    echo '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
}

1
Tôi tò mò muốn biết liệu cách này có nhanh hơn phương pháp mã hóa mà tôi đã đề xuất hay không. Bất kỳ điểm chuẩn nào xung quanh?
Capsule

array_filter()đã được đề cập bởi @ dogmatic69. Về hiệu suất - tôi tin rằng đơn giản foreachsẽ nhanh hơn cả hai array_filter()implode().
binaryLV

Đây là một cảnh đẹp cho các điểm chuẩn php của các hàm tích hợp sẵn phpbench.com nhưng có lẽ nó sẽ phụ thuộc vào kích thước của mảng. Mảng càng lớn thì phương thức này càng nhanh.
xzyfer

1
@xzyfer, if(implode($array)) echo '..'sẽ in '..' ngay cả khi một phần tử mảng sẽ là (string)"0". Về foreachviệc chậm hơn array_filter()- bạn có chắc không? Làm cách nào để xóa từng phần tử mảng nhanh hơn là chỉ đọc các phần tử mảng?
binaryLV

2
@xzyfer, tôi đã thực hiện một số thử nghiệm - array_filter()chỉ sử dụng để kiểm tra xem có giá trị nào được điền chậm hơn ít nhất vài lần so với foreachvòng lặp cơ bản với một số biến boolean để lưu trữ kết quả và breakgiá trị không hợp lệ đầu tiên hay không. Ngay cả array_filter()khi là một "hàm PHP gốc", nó không thể thực sự nhanh hơn foreachvì nó phải tạo biến mảng mới.
binaryLV

20

mã hóa mảng bằng keo rỗng và kiểm tra kích thước của chuỗi kết quả:

<?php if (strlen(implode($array)) == 0) echo 'all values of $array are empty'; ?>

YOu có thể xóa strlencuộc gọi để làm cho việc này hiệu quả hơn. if(implode($array)) echo '..'
xzyfer

@binaryLV, như thế nào? Đồng ý rằng cả hai đều không giải quyết được vấn đề. Nhưng chúng không tương đồng phải không?
xzyfer

1
@xzyfer, nếu $str(string)'0', thì strlen($str) == 0đánh giá thành false, trong khi !$strné tránh thành true, do đó strlen($str) == 0không thể thay thế bằng !$str.
binaryLV

Giải pháp này cho cảm giác đúng đắn hơn so với việc sử dụng array_filter, vì array_filterbạn biết đấy, được sử dụng với một lệnh gọi lại để lọc một mảng. Nhưng tất cả những gì bạn muốn làm là kiểm tra 'sự trống rỗng'. Vì vậy, bạn tạo một chuỗi của nó và kiểm tra độ dài của nó. Xuất sắc.
kasimir

2
@kasimir chức năng gọi lại của array_filterlà tùy chọn và hướng dẫn sử dụng ghi rõ Nếu không có lệnh gọi lại nào được cung cấp, tất cả các mục nhập bằng FALSE (xem chuyển đổi thành boolean) sẽ bị xóa. Vì vậy, sử dụng array_filterkhông phải là ít đúng hơn này, nó chỉ là một phương pháp khác nhau ;-)
Capsule

7

Một câu hỏi cũ hơn nhưng tôi nghĩ tôi sẽ đưa ra giải pháp của mình vì nó chưa được liệt kê ở trên.

function isArrayEmpty($array) {
    foreach($array as $key => $val) {
        if ($val !== '')
            return false;
    }
    return true;
}

1
empty()có thể cung cấp kết quả dương tính giả. Xem hướng dẫn về cách hàm xử lý falseycác giá trị. Tôi muốn giới thiệu cuộc gọi strlen()thay thế.
mickmackusa

Cảm ơn lời nhắc về falseyness @mickmackusa, tôi đã cập nhật nó để kiểm tra tính rõ ràng cho chuỗi trống.
mulquin

2

bạn không thực sự cần nó.
Bạn sẽ xác thực các trường này một cách riêng biệt và bằng cách kết thúc quá trình này, bạn có thể biết liệu mảng có trống không (hoặc chứa các giá trị không hợp lệ, giá trị này giống nhau)


hấp dẫn! Tôi tự hỏi liệu điều này có nhanh hơn việc giải mã mảng không.
Capsule

2
@Capsule cho kích thước mảng là 6, bạn sẽ không bao giờ thấy sự khác biệt nhỏ nhất, ngay cả khi bạn dành cả đời để kiểm tra các mảng. đối với các kích thước hơn 1000, tôi khuyên bạn không nên sử dụng mảng.
Your Common Sense,

Vì chúng ta đang nói về các trang web, bạn phải nhân số đó trên số lượng khách truy cập của bạn. Một mảng 1000 hoặc 100 khách truy cập tính toán mảng 10 là như nhau về chi phí CPU. Bạn không thể quyết định ngừng sử dụng mảng vì trang web của bạn đang trở nên phổ biến ;-)
Capsule

2

đơn giản hóa việc sử dụng theo cách này:

$array = []; //target array
$is_empty = true; //flag

foreach ($array as $key => $value) {
    if ($value != '')
        $is_empty = false;
}
if ($is_empty)
    echo 'array is empty!';
else
    echo 'array is not empty!';

0

Định nghĩa của bạn về mảng $ không chính xác và có một dấu ngoặc kép. Nó sẽ đọc:

$array = array( 'RequestID' =>  $_POST["RequestID"],
                'ClientName' => $_POST["ClientName"],
                'Username' => $_POST["Username"],
                'RequestAssignee' => $_POST["RequestAssignee"],
                'Status' => $_POST["Status"],
                'Priority' => $_POST["Priority"] );

3
Bạn có thể sử dụng một trong hai. Dấu ngoặc kép thực sự chậm hơn một chút.
Aaron Harun

@AaronHarun. Hãy xem phiên bản gốc của câu hỏi, có những trích dẫn không chính xác kỳ lạ. Điều đó nói rằng, điều này sửa chữa điều đó, nhưng không cố gắng thực sự trả lời câu hỏi.
TRiG

-1

Tôi có cùng một câu hỏi nhưng muốn kiểm tra từng phần tử trong mảng riêng biệt để xem cái nào trống. Điều này khó hơn mong đợi vì bạn cần tạo các giá trị khóa và giá trị thực trong các mảng riêng biệt để kiểm tra và phản hồi phần tử mảng trống.

print_r($requestDecoded);
$arrayValues = array_values($requestDecoded);  //Create array of values
$arrayKeys = array_keys($requestDecoded);      //Create array of keys to count
$count = count($arrayKeys);
for($i = 0; $i < $count; $i++){  
    if ( empty ($arrayValues[$i] ) ) {         //Check which value is empty
        echo $arrayKeys[$i]. " can't be empty.\r\n";
    } 
}

Kết quả:

Array
(
    [PONumber] => F12345
    [CompanyName] => Test
    [CompanyNum] => 222222
    [ProductName] => Test
    [Quantity] =>
    [Manufacturer] => Test
)

Số lượng không được để trống.


gì? Chỉ cần sử dụng foreach($array as $key => $value)và kiểm tra xem $valuecó sản phẩm nào không.
Capsule

-2

KHÔNG ĐƯỢC KIỂM TRA NHƯNG bạn hiểu được logic :)

$error = 0;
foreach ($array as $k => $v){
    if (empty($v)) {
        $error++;
    }
}

if ($error == count($array)) {
    $error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
}

2
(không phải lời tán thành của tôi, nhưng ...) Đây đơn giản không phải là một cách tiếp cận ổn định / đáng tin cậy. 3v4l.org/g3Jf6 Vui lòng xóa câu trả lời này để bạn không gây nhầm lẫn cho người đọc hoặc tệ hơn - khuyến khích họ sử dụng một phương pháp xấu.
mickmackusa

-4

điều này khá đơn giản:

foreach($array as $k => $v)
{
    if(empty($v))
    {
        unset($array[$k]);
    }
}
$show_error = count($array) == 0;

bạn cũng sẽ phải thay đổi cách đóng gói cho các giá trị mảng thành dấu ngoặc kép.


Anh ấy không cần số. Chỉ cần 1 là đủ
Your Common Sense,

Cái gì ?, anh ấy muốn biết nếu tất cả các phần tử đều trống, không có số nào chỉ là boolean
RobertPitt

Tôi nghĩ những gì Đại tá đang nói một cách điên cuồng là trong PHP cả hai count($array) == 0count($array)đánh giá là true nên các bước so sánh và gán thêm là không cần thiết bị nghe lén. Mặc dù các bài tập tốn rất ít chi phí trong php.
xzyfer

Ahhh yea, nó không thực sự tạo ra sự khác biệt lớn nhưng tôi thà làm việc với boolean hầu hết thời gian, tôi không hiểu tại sao số phiếu giảm, đó là một phương pháp làm việc và tạo ra cho anh ta kết quả cần thiết.
RobertPitt

để cho biết một mảng có trống hay không, chỉ cần tìm MỘT phần tử được lấp đầy là đủ. nó được gọi là LOGIC.
Your Common Sense
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.