모든 배열 항목이 비어 있는지 확인 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에 의해 언급되었습니다. 성능 정보-단순함 foreacharray_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.