모든 배열 항목이 비어 있는지 확인 PHP


83

양식에서 항목 배열을 추가하고 모두 비어있는 경우 일부 유효성 검사를 수행하고 오류 문자열에 추가하고 싶습니다. 그래서 나는 가지고있다:

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

그런 다음 모든 배열 요소가 비어 있으면 다음을 수행하십시오.

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

5
이 글을 읽고 혼란스러워하는 사람에게는 $ _POST를 작은 따옴표로 묶지 마십시오. 평가되지 않습니다!
— Jamie

2
나는 따옴표를 편집 할 자유를 제거했습니다.
— xtofl

답변:


177

내장 된 array_filter를 사용할 수 있습니다.

콜백이 제공되지 않으면 FALSE (부울로 변환 참조)와 동일한 입력 항목이 모두 제거됩니다.

그래서 이것을 한 줄로 할 수 있습니다.

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
이것이 내가 제안한 내파 방법보다 빠른지 궁금합니다. 주변에 벤치 마크가 있습니까?
— Capsule

array_filter()이미 @ dogmatic69에 의해 언급되었습니다. 성능 정보-단순함 foreach이 array_filter()및 implode().
— binaryLV

다음은 내장 함수 phpbench.com 의 PHP 벤치 마크에 대한 훌륭한 광경 이지만 아마도 배열의 크기에 따라 달라질 것입니다. 배열이 클수록이 방법은 빠릅니다.
— xzyfer

1
@xzyfer if(implode($array)) echo '..'는 하나의 배열 요소가 (string)"0". foreach보다 느린 것에 대해 array_filter()-확실합니까? 배열 요소를 읽는 것보다 배열 요소를 하나씩 제거하는 것이 어떻게 더 빠릅니까?
— binaryLV

2
@xzyfer, 몇 가지 테스트를 수행했습니다. array_filter()값이 채워져 있는지 확인 하기 위해 결과를 저장하고 첫 번째 잘못된 값에 대한 부울 변수 가있는 기본 루프 보다 최소한 몇 배 더 느립니다 . "네이티브 PHP 함수"라고 해도 새로운 배열 변수를 생성 해야하는 것보다 더 빠를 수는 없습니다 . foreachbreakarray_filter()foreach
— binaryLV

22

빈 접착제로 배열을 내파하고 결과 문자열의 크기를 확인합니다.

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

strlen더 효율적으로 만들기 위해 호출을 제거 할 수 있습니다. if(implode($array)) echo '..'
— xzyfer

@binaryLV, 어떻게? 둘 다 문제를 해결하지 못한다는 데 동의했습니다. 그러나 그들은 동등하지 않습니까?
— xzyfer

1
@xzyfer 경우가 $str있다 (string)'0'하고 strlen($str) == 0평가 false하면서 !$str행 evaulates이 true때문에 strlen($str) == 0교체 할 수 없다 !$str.
— binaryLV

이 솔루션은 배열 을 필터링 하기 위해 콜백과 함께 사용하기위한 array_filter것이기 때문에 를 사용하는 것보다 더 정확하다고 느낍니다 . 그러나 당신이 원하는 것은 '공허함'을 확인하는 것입니다. 그래서 당신은 그것의 끈을 만들고 길이를 확인합니다. 훌륭한. array_filter
— kasimir

2
@kasimir의 콜백 함수 array_filter는 선택 사항이며 매뉴얼 에는 콜백이 제공되지 않으면 FALSE (부울로 변환 참조)와 동일한 입력 항목이 모두 제거됩니다. 따라서 사용 array_filter은 이것보다 덜 정확하지 않습니다. 다른 방법 일뿐입니다 ;-)
— Capsule

7

오래된 질문이지만 위에 나열되지 않았기 때문에 내 솔루션에 팝업 될 것이라고 생각했습니다.

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

1
empty()위양성 결과를 제공 할 수 있습니다. 함수가 falsey값을 처리하는 방법에 대한 설명서를 참조하십시오 . strlen()대신 전화를 권장합니다 .
— mickmackusa

거짓 @mickmackusa에 대한 알림을 보내 주셔서 감사합니다. 빈 문자열이 있는지 명시 적으로 확인하도록 업데이트했습니다.
— mulquin

2

정말 필요하지 않습니다.
이 필드를 개별적으로 검증하고이 프로세스를 완료하면 배열이 비어 있는지 (또는 동일한 값이 잘못된 값을 포함하는지) 알 수 있습니다.


흥미 롭군요! 이것이 어레이를 파열하는 것보다 빠른지 궁금합니다.
— Capsule

2
배열 크기가 6 인 경우 @Capsule을 사용하면 평생 동안 배열을 확인하는 데에도 약간의 차이를 볼 수 없습니다. 크기가 1000 이상인 경우 배열을 전혀 사용하지 않는 것이 좋습니다.
— 당신의 상식

우리는 웹 사이트에 대해 이야기하고 있기 때문에 방문자 수에 따라 곱해야합니다. 10 명의 배열을 계산하는 1000 명 또는 100 명의 방문자 배열은 CPU 비용 측면에서 동일합니다. 귀하의 웹 사이트가 인기를 얻고 있기 때문에 어레이 사용을 중단 할 수 없습니다. ;-)
— Capsule

2

이 방법으로 사용을 단순화하십시오.

$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

$ array의 정의가 잘못되었으며 작은 따옴표가 있습니다. 읽어야합니다.

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

3
둘 중 하나를 사용할 수 있습니다. 큰 따옴표는 실제로 약간 느립니다.
— Aaron Harun

@AaronHarun. 이상하게 잘못된 인용문이있는 질문의 원래 버전을보십시오. 즉, 이것은 그것을 수정하지만 실제로 질문 자체에 대답하려고 시도하지는 않습니다.
— TRiG

-1

나는 같은 질문이 있었지만 배열의 각 요소를 개별적으로 확인하여 어느 것이 비어 있는지 확인하고 싶었습니다. 빈 배열 요소를 확인하고 응답하기 위해 별도의 배열에 키 값과 실제 값을 만들어야하므로 예상보다 어려웠습니다.

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";
    } 
}

결과:

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

수량은 비워 둘 수 없습니다.


뭐? 비어 있지 않은지 사용 foreach($array as $key => $value)하고 테스트하십시오 $value.
— Capsule

-2

테스트되지 않았지만 논리를 얻으십시오. :)

$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
(내 반대표는 아니지만 ...) 이것은 단순히 안정적이고 신뢰할 수있는 접근 방식이 아닙니다. 3v4l.org/g3Jf6 독자를 혼동하거나 더 나쁘게하지 않도록이 답변을 삭제하세요. 나쁜 방법을 사용하도록 권장하세요.
— mickmackusa

-4

이것은 매우 간단합니다.

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

또한 배열 값에 대한 캡슐화를 큰 따옴표로 변경해야합니다.


그는 번호가 필요하지 않습니다. 1
— 귀하의 상식

무엇? 그는 알고 싶어 하는 모든 요소가 비어있는 것은, 어떤 수를 단지 부울 없다
— RobertPitt

나는 어떤 골이 crassly 말하는 것은 PHP 모두 있다고 생각 count($array) == 0하고 count($array)여분의 비교 및 할당 단계가 필요 엿 그래서 true로 평가합니다. PHP에서는 할당 비용이 거의 들지 않지만.
— xzyfer

Ahhh yea, 그것은 실제로 큰 차이를 만들지 않지만 오히려 대부분의 시간을 부울로 작업하고 싶습니다. 왜 다운 투표가 작동하는지 이해하지 못합니다. 작업 방법이며 그에게 필요한 결과를 만듭니다.
— RobertPitt

배열이 비어 있는지 여부를 말하면 채워진 요소를 하나만 찾는 것으로 충분합니다. LOGIC이라고합니다.
— 당신의 상식
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.