Como verificar se uma matriz está vazia usando PHP?

471

playersestará vazio ou uma lista separada por vírgula (ou um valor único). Qual é a maneira mais fácil de verificar se está vazia? Estou assumindo que posso fazê-lo assim que buscar a $gameresultmatriz $gamerow? Nesse caso, provavelmente seria mais eficiente pular a explosão $playerlistse ela estiver vazia, mas por uma questão de argumento, como eu verificaria se uma matriz também está vazia?

$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);
aslum
fonte
2
Não use count (), sizeof (), empty (). Retorno de matriz vazio false: if ($ array) {
Limitrof 10/01

Respostas:

774

Se você só precisa verificar se há QUALQUER elemento na matriz

if (empty($playerlist)) {
     // list is empty.
}

Se você precisar limpar valores vazios antes de verificar (geralmente feito para evitar explodeseqüências de caracteres estranhas):

foreach ($playerlist as $key => $value) {
    if (empty($value)) {
       unset($playerlist[$key]);
    }
}
if (empty($playerlist)) {
   //empty array
}
Tyler Carter
fonte
2
Você não deveria apenas usar vazio? A contagem levará mais tempo para ser executada em matrizes grandes.
Dan McGrath
1
Feito. Eu também mudei isso porque você não precisa usar isset e outras coisas.
Tyler Carter
5
Dado o seu exemplo de código, a variável será definida para que você não precise usar empty().
Cobby
4
CUIDADO! if(!isset($emptyarray))é falseapenas if(empty($emptyarray))retorna true. Isso só me pregado
Kolob Canyon
161

Uma matriz vazia é falsey no PHP, então você nem precisa usar empty()como outros sugeriram.

<?php
$playerList = array();
if (!$playerList) {
    echo "No players";
} else {
    echo "Explode stuff...";
}
// Output is: No players

PHP da empty()determina se uma variável não existe ou tem um valor Falsey (como array(), 0, null, false, etc).

Na maioria dos casos, você apenas deseja verificar !$emptyVar. Use empty($emptyVar)se a variável pode não ter sido definida E você não costuma acionar um E_NOTICE; OMI geralmente é uma má idéia.

Cobby
fonte
2
Espero que isso não vai mudar em algum padrão ... vai ser doloroso
David Constantine
79

Algumas respostas decentes, mas pensei em expandir um pouco para explicar mais claramente quando o PHP determinar se um array está vazio.


Notas principais:

Uma matriz com uma chave (ou chaves) será determinada como NÃO vazia pelo PHP.

Como os valores da matriz precisam de chaves para existir, ter valores ou não em uma matriz não determina se está vazio, apenas se não houver chaves (E, portanto, sem valores).

Portanto, verificar um array com empty()simplesmente não informa se você tem valores ou não, ele informa se o array está vazio e as chaves fazem parte de um array.


Portanto, considere como você está produzindo sua matriz antes de decidir qual método de verificação usar.
EG Uma matriz terá chaves quando um usuário enviar seu formulário HTML quando cada campo de formulário tiver um nome de matriz (ou seja name="array[]").
Uma matriz não vazia será produzida para cada campo, pois haverá valores de chave incrementados automaticamente para a matriz de cada campo de formulário.

Veja estas matrizes, por exemplo:

/* Assigning some arrays */

// Array with user defined key and value
$ArrayOne = array("UserKeyA" => "UserValueA", "UserKeyB" => "UserValueB");

// Array with auto increment key and user defined value
// as a form field would return with user input
$ArrayTwo[] = "UserValue01";
$ArrayTwo[] = "UserValue02";

// Array with auto incremented key and no value
// as a form field would return without user input
$ArrayThree[] = '';
$ArrayThree[] = '';

Se você repetir as chaves e os valores das matrizes acima, obtém o seguinte:

ARRAY ONE:
[UserKeyA] => [UserValueA]
[UserKeyB] => [UserValueB]

ARRAY DOIS:
[0] => [UserValue01]
[1] => [UserValue02]

ARRAY TRÊS:
[0] => []
[1] => []

E testar as matrizes acima com empty()retorna os seguintes resultados:

ARRAY ONE:
$ ArrayOne não está vazio

ARRAY
DOWO : $ ArrayTwo não está vazio

ARRAY THREE:
$ ArrayThree não está vazio

Uma matriz sempre estará vazia quando você atribui uma matriz, mas não a usa posteriormente, como:

$ArrayFour = array();

Isso ficará vazio, ou seja, o PHP retornará TRUE quando usado se estiver empty()acima.

Portanto, se a sua matriz tiver chaves - seja por exemplo, os nomes de entrada de um formulário ou se você as atribuir manualmente (por exemplo, crie uma matriz com os nomes das colunas do banco de dados como as chaves, mas sem valores / dados do banco de dados), a matriz NÃO será empty().

Nesse caso, você pode fazer um loop na matriz em um foreach, testando se cada chave possui um valor. Esse é um bom método se você precisar executar a matriz de qualquer maneira, talvez verificando as chaves ou limpando os dados.

No entanto, não é o melhor método se você simplesmente precisar "se os valores existirem" retorna VERDADEIRO ou FALSO . Existem vários métodos para determinar se uma matriz possui algum valor quando sabe que terá chaves. Uma função ou classe pode ser a melhor abordagem, mas, como sempre, depende do seu ambiente e dos requisitos exatos, além de outras coisas, como o que você faz atualmente com a matriz (se houver).


Aqui está uma abordagem que usa muito pouco código para verificar se uma matriz possui valores:

Usando array_filter():
itera sobre cada valor na matriz, passando-os para a função de retorno de chamada. Se a função de retorno de chamada retornar true, o valor atual da matriz será retornado para a matriz de resultados. As chaves da matriz são preservadas.

$EmptyTestArray = array_filter($ArrayOne);

if (!empty($EmptyTestArray))
  {
    // do some tests on the values in $ArrayOne
  }
else
  {
    // Likely not to need an else, 
    // but could return message to user "you entered nothing" etc etc
  }

A execução array_filter()nas três matrizes de exemplo (criadas no primeiro bloco de código nesta resposta) resulta no seguinte:

ARRAY ONE:
$ arrayone não está vazio

ARRAY DOIS:
$ arraytwo não está vazio

ARRAY TRÊS:
$ arraythree está vazio

Portanto, quando não há valores, sejam chaves ou não, use array_filter()para criar uma nova matriz e verifique se a nova matriz está vazia mostra se havia algum valor na matriz original.
Não é o ideal e é um pouco confuso, mas se você tem uma matriz enorme e não precisa fazer uma repetição por qualquer outro motivo, esse é o mais simples em termos de código necessário.


Não tenho experiência em verificar despesas gerais, mas seria bom saber as diferenças entre usar array_filter()e foreachverificar se um valor foi encontrado.

Obviamente, o benchmark precisaria estar em vários parâmetros, em matrizes pequenas e grandes e quando houver valores e não etc.

James
fonte
2
Muito obrigado por isso. Foi muito informativo e foi capaz de resolver o meu problema usandoarray_filter()
Brian Powell
esvaziar (matriz ()) será sempre evaludate para falso, então a adição de contagem (matriz ()) == 0 irá produzir verdadeiro
timmz
1
@mboullouz count(array())==0é falso quando há chaves e nenhum valor, portanto, isso não ajuda na verificação apenas de valores. Sua declaração está correta, mas você está forçando um teste com count(array())a matriz, é claro, vazia. Precisamos verificar quando a matriz retornou de um formulário ou em algum outro lugar para saber se está vazia (chaves / valores) ou se apenas tem valores ou não
James
Esta solução é perfeita para este tipo de matrizes, por exemplo ajuda quando você deseja validar um arquivo de entrada array_filter($_FILES["documento"]['name'])
Gendrith
20

count($gamerow['players']) será 0.

Ignacio Vazquez-Abrams
fonte
old school da melhor como sempre, basta verificar o índice da matriz.
dinamarquês
Esta é uma chamada de função a mais.
mickmackusa 28/01
12

Se você deseja verificar se a variável que você está testando é realmente uma matriz vazia, você pode usar algo como isto:

if ($variableToTest === array()) {
    echo 'this is explicitly an empty array!';
}
Tim Ogilvy
fonte
11

Se você deseja excluir as linhas falsas ou vazias (como 0 => ''), onde o uso empty()falhará, tente:

if (array_filter($playerlist) == []) {
  // Array is empty!
}

array_filter(): Se nenhum retorno de chamada for fornecido, todas as entradas da matriz iguais a FALSE (consulte a conversão para booleano) serão removidas.

Se você deseja remover todas as cadeias NULL, FALSE e vazias ( ''), mas deixar valores zero ( 0), pode usar strlencomo retorno de chamada, por exemplo:

$is_empty = array_filter($playerlist, 'strlen') == [];
kenorb
fonte
Esta é a resposta correta para uma pergunta diferente. O uso do filtro de matriz destruirá os elementos existentes com valores falsey. Não é isso que o OP está pedindo.
mickmackusa 28/01
8

Por que ninguém disse esta resposta:

$array = [];

if($array == []) {
    // array is empty
}
Roubar
fonte
1
Sua declaração não está correta. Alguém disse essa resposta - Tim Ogilvy - um ano antes. Usar chaves quadradas em vez de array()é a mesma coisa.
mickmackusa 28/01
Enquanto sob o capô, é a mesma resposta ... tecnicamente. Eu usei os colchetes em vez da função de matriz desatualizada.
Rob
7
is_array($detect) && empty($detect);

is_array

zloctb
fonte
Essas são verificações desnecessárias. O OP está chamando explode()- ele retorna dados do tipo array. A verificação empty()é uma chamada de função desnecessária. Como afirma Cobby em 2012, if($detect)é tudo o que é necessário. Esta solução não deve ser implementada para esta tarefa ou outras. Você pode argumentar que você está cobrindo situações além do escopo deste pergunta, bem, nunca há uma necessidade de chamar empty()APÓS is_array()porque se a variável não é "set", em seguida, is_array()irá gerar "Aviso: Undefined variable", se isset(), em seguida, empty()é um exagero, use apenas A resposta do Cobby.
mickmackusa 28/01
6

Corri o benchmark incluído no final do post. Para comparar os métodos:

  • count($arr) == 0 : contagem
  • empty($arr) : vazio
  • $arr == [] : comp
  • (bool) $arr : fundida

e obteve os seguintes resultados

Contents  \method |    count     |    empty     |     comp     |     cast     |
------------------|--------------|--------------|--------------|--------------|
            Empty |/* 1.213138 */|/* 1.070011 */|/* 1.628529 */|   1.051795   |
          Uniform |/* 1.206680 */|   1.047339   |/* 1.498836 */|/* 1.052737 */|
          Integer |/* 1.209668 */|/* 1.079858 */|/* 1.486134 */|   1.051138   |
           String |/* 1.242137 */|   1.049148   |/* 1.630259 */|/* 1.056610 */|
            Mixed |/* 1.229072 */|/* 1.068569 */|/* 1.473339 */|   1.064111   |
      Associative |/* 1.206311 */|   1.053642   |/* 1.480637 */|/* 1.137740 */|
------------------|--------------|--------------|--------------|--------------|
            Total |/* 7.307005 */|   6.368568   |/* 9.197733 */|/* 6.414131 */|

A diferença entre vazio e conversão para um booleano é insignificante. Eu executei esse teste várias vezes e eles parecem ser essencialmente equivalentes. O conteúdo das matrizes não parece desempenhar um papel significativo. Os dois produzem resultados opostos, mas a negação lógica mal é suficiente para levar o elenco à vitória na maioria das vezes, então eu pessoalmente prefiro vazio por razões de legibilidade em ambos os casos.

#!/usr/bin/php
<?php

//    012345678
$nt = 90000000;

$arr0 = [];
$arr1 = [];
$arr2 = [];
$arr3 = [];
$arr4 = [];
$arr5 = [];

for ($i = 0; $i < 500000; $i++) {
    $arr1[] = 0;
    $arr2[] = $i;
    $arr3[] = md5($i);
    $arr4[] = $i % 2 ? $i : md5($i);
    $arr5[md5($i)] = $i;
}

$t00 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr0) == 0;
}
$t01 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr0);
}
$t02 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr0 == [];
}
$t03 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr0;
}
$t04 = microtime(true);

$t10 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr1) == 0;
}
$t11 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr1);
}
$t12 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr1 == [];
}
$t13 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr1;
}
$t14 = microtime(true);

/* ------------------------------ */

$t20 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr2) == 0;
}
$t21 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr2);
}
$t22 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr2 == [];
}
$t23 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr2;
}
$t24 = microtime(true);

/* ------------------------------ */

$t30 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr3) == 0;
}
$t31 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr3);
}
$t32 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr3 == [];
}
$t33 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr3;
}
$t34 = microtime(true);

/* ------------------------------ */

$t40 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr4) == 0;
}
$t41 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr4);
}
$t42 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr4 == [];
}
$t43 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr4;
}
$t44 = microtime(true);

/* ----------------------------------- */

$t50 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    count($arr5) == 0;
}
$t51 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    empty($arr5);
}
$t52 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    $arr5 == [];
}
$t53 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
    (bool) $arr5;
}
$t54 = microtime(true);

/* ----------------------------------- */

$t60 = $t00 + $t10 + $t20 + $t30 + $t40 + $t50;
$t61 = $t01 + $t11 + $t21 + $t31 + $t41 + $t51;
$t62 = $t02 + $t12 + $t22 + $t32 + $t42 + $t52;
$t63 = $t03 + $t13 + $t23 + $t33 + $t43 + $t53;
$t64 = $t04 + $t14 + $t24 + $t34 + $t44 + $t54;

/* ----------------------------------- */

$ts0[1] = number_format(round($t01 - $t00, 6), 6);
$ts0[2] = number_format(round($t02 - $t01, 6), 6);
$ts0[3] = number_format(round($t03 - $t02, 6), 6);
$ts0[4] = number_format(round($t04 - $t03, 6), 6);

$min_idx = array_keys($ts0, min($ts0))[0];
foreach ($ts0 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts0[$idx] = "   $val   ";
    } else {
        $ts0[$idx] = "/* $val */";
    }

}

$ts1[1] = number_format(round($t11 - $t10, 6), 6);
$ts1[2] = number_format(round($t12 - $t11, 6), 6);
$ts1[3] = number_format(round($t13 - $t12, 6), 6);
$ts1[4] = number_format(round($t14 - $t13, 6), 6);

$min_idx = array_keys($ts1, min($ts1))[0];
foreach ($ts1 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts1[$idx] = "   $val   ";
    } else {
        $ts1[$idx] = "/* $val */";
    }

}

$ts2[1] = number_format(round($t21 - $t20, 6), 6);
$ts2[2] = number_format(round($t22 - $t21, 6), 6);
$ts2[3] = number_format(round($t23 - $t22, 6), 6);
$ts2[4] = number_format(round($t24 - $t23, 6), 6);

$min_idx = array_keys($ts2, min($ts2))[0];
foreach ($ts2 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts2[$idx] = "   $val   ";
    } else {
        $ts2[$idx] = "/* $val */";
    }

}

$ts3[1] = number_format(round($t31 - $t30, 6), 6);
$ts3[2] = number_format(round($t32 - $t31, 6), 6);
$ts3[3] = number_format(round($t33 - $t32, 6), 6);
$ts3[4] = number_format(round($t34 - $t33, 6), 6);

$min_idx = array_keys($ts3, min($ts3))[0];
foreach ($ts3 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts3[$idx] = "   $val   ";
    } else {
        $ts3[$idx] = "/* $val */";
    }

}

$ts4[1] = number_format(round($t41 - $t40, 6), 6);
$ts4[2] = number_format(round($t42 - $t41, 6), 6);
$ts4[3] = number_format(round($t43 - $t42, 6), 6);
$ts4[4] = number_format(round($t44 - $t43, 6), 6);

$min_idx = array_keys($ts4, min($ts4))[0];
foreach ($ts4 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts4[$idx] = "   $val   ";
    } else {
        $ts4[$idx] = "/* $val */";
    }

}

$ts5[1] = number_format(round($t51 - $t50, 6), 6);
$ts5[2] = number_format(round($t52 - $t51, 6), 6);
$ts5[3] = number_format(round($t53 - $t52, 6), 6);
$ts5[4] = number_format(round($t54 - $t53, 6), 6);

$min_idx = array_keys($ts5, min($ts5))[0];
foreach ($ts5 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts5[$idx] = "   $val   ";
    } else {
        $ts5[$idx] = "/* $val */";
    }

}

$ts6[1] = number_format(round($t61 - $t60, 6), 6);
$ts6[2] = number_format(round($t62 - $t61, 6), 6);
$ts6[3] = number_format(round($t63 - $t62, 6), 6);
$ts6[4] = number_format(round($t64 - $t63, 6), 6);

$min_idx = array_keys($ts6, min($ts6))[0];
foreach ($ts6 as $idx => $val) {
    if ($idx == $min_idx) {
        $ts6[$idx] = "   $val   ";
    } else {
        $ts6[$idx] = "/* $val */";
    }

}

echo "             |    count     |    empty     |     comp     |     cast     |\n";
echo "-------------|--------------|--------------|--------------|--------------|\n";
echo "       Empty |";
echo $ts0[1] . '|';
echo $ts0[2] . '|';
echo $ts0[3] . '|';
echo $ts0[4] . "|\n";

echo "     Uniform |";
echo $ts1[1] . '|';
echo $ts1[2] . '|';
echo $ts1[3] . '|';
echo $ts1[4] . "|\n";

echo "     Integer |";
echo $ts2[1] . '|';
echo $ts2[2] . '|';
echo $ts2[3] . '|';
echo $ts2[4] . "|\n";

echo "      String |";
echo $ts3[1] . '|';
echo $ts3[2] . '|';
echo $ts3[3] . '|';
echo $ts3[4] . "|\n";

echo "       Mixed |";
echo $ts4[1] . '|';
echo $ts4[2] . '|';
echo $ts4[3] . '|';
echo $ts4[4] . "|\n";

echo " Associative |";
echo $ts5[1] . '|';
echo $ts5[2] . '|';
echo $ts5[3] . '|';
echo $ts5[4] . "|\n";

echo "-------------|--------------|--------------|--------------|--------------|\n";
echo "       Total |";
echo $ts6[1] . '|';
echo $ts6[2] . '|';
echo $ts6[3] . '|';
echo $ts6[4] . "|\n";
kaan_a
fonte
Bom benchmark, mas você esqueceu sizeofqual é [não?] Alias ​​de empty... stackoverflow.com/a/51986794/1429432
Yousha Aleayoub
FYI: Quando executei esse benchmark usando o PHP 7.4, obtive resultados diferentes que indicaram que a comparação foi a mais rápida.
Nick Merrill
5

se você quiser verificar o conteúdo da matriz, poderá usar:

$arr = array();

if(!empty($arr)){
  echo "not empty";
}
else 
{
  echo "empty";
}

veja aqui: http://codepad.org/EORE4k7v

nothingchen01
fonte
Conforme mostrado por Cobby em 2012, não é necessário chamar uma função para verificar se uma matriz declarada está vazia ou não.
mickmackusa 28/01
5

Na minha opinião, a maneira mais simples para uma matriz indexada seria simplesmente:

    if ($array) {
      //Array is not empty...  
    }

Uma condição 'if' na matriz seria avaliada como true se a matriz não estiver vazia e false se a matriz estiver vazia . Isso não é aplicável a matrizes associativas.

PJately
fonte
Cobby efetivamente declarou essa técnica em 2012. Sua resposta atualmente tem 133 votos positivos.
Mickmackusa #
Isso não é "mais simples", por uma questão de opinião - é mais simples, porque não há sintaxe que possa ser mais concisa e não possui sobrecarga de chamada de função. ABSOLUTAMENTE NENHUMA DIFERENÇA para acessar uma matriz com chaves indexadas versus chaves associativas. Esta resposta é pesquisadores enganosos. Esta resposta é redundante e depois incorporada . 3v4l.org/DSLha
mickmackusa 28/01
3

Eu uso esse código

$variable = array();

if( count( $variable ) == 0 )
{
    echo "Array is Empty";
}
else
{
    echo "Array is not Empty";
}

Mas observe que, se a matriz tiver um grande número de chaves, esse código passará muito tempo contando-as, em comparação com as outras respostas aqui.

Joseph Asir Raja
fonte
Conforme mostrado por Cobby em 2012, não é necessário chamar uma função para verificar se uma matriz declarada está vazia ou não.
mickmackusa 28/01
3

Você pode usar o array_filter()que funciona muito bem para todas as situações:

$ray_state = array_filter($myarray);

if (empty($ray_state)) {
    echo 'array is empty';
} else {
    echo 'array is not empty';
}
user889030
fonte
1
Esta resposta está empregando verificações desnecessárias. Primeiro, o OP não está interessado em filtrar nenhum valor de falsey da matriz antes de verificar seu vazio - portanto, você se desviou da pergunta postada. Segundo, como mostrado por Cobby em 2012, não é necessário chamar uma função para verificar se uma matriz declarada está vazia ou não.
mickmackusa 28/01
2
 $gamerow = mysql_fetch_array($gameresult);

if (!empty(($gamerow['players'])) {
   $playerlist = explode(",", $gamerow['players']);
}else{

  // do stuf if array is empty
}
Anish Rai
fonte
2

Eu acho que a melhor maneira de determinar se a matriz está vazia ou não é usar count () assim:

if(count($array)) {
    return 'anything true goes here';
}else {
    return 'anything false'; 
}
Anas Red
fonte
A count()chamada pode ser totalmente removida - veja a resposta de Cobby.
mickmackusa 28/01
2

Tomar a decisão mais apropriada requer conhecer a qualidade dos seus dados e quais processos devem ser seguidos.

  1. Se você vai desqualificar / desconsiderar / remover esta linha, o primeiro ponto de filtragem deve estar na consulta mysql.

    • WHERE players IS NOT NULL
    • WHERE players != ''
    • WHERE COALESCE(players, '') != ''
    • WHERE players IS NOT NULL AND players != ''
    • ... depende dos dados da sua loja e haverá outras maneiras, vou parar por aqui.
  2. Se você não tiver 100% de certeza se a coluna existirá no conjunto de resultados, verifique se a coluna está declarada. Isto significa chamar array_key_exists(), isset()ou empty()na coluna. Não vou me incomodar em delinear as diferenças aqui (existem outras páginas de SO para esse detalhamento, aqui está um começo: 1 , 2 , 3 ). Dito isto, se você não estiver no controle total do conjunto de resultados, talvez tenha uma "flexibilidade" excessiva da aplicação e deva repensar se vale a pena o problema de acessar potencialmente dados inexistentes da coluna. Efetivamente, estou dizendo que você nunca deve verificar se uma coluna é declarada - portanto, você nunca precisará empty()dessa tarefa. Se alguém está argumentando queempty()é mais apropriado, eles estão expondo sua própria opinião pessoal sobre a expressividade dos scripts. Se você achar que a condição no 5 abaixo é ambígua, adicione um comentário embutido ao seu código - mas não o faria. A conclusão é que não há vantagem programática em fazer a chamada de função.

  3. O valor da string pode conter um valor 0que você deseja considerar verdadeiro / válido / não vazio? Nesse caso, você só precisa verificar se o valor da coluna tem comprimento.

    Aqui está uma demonstração usando strlen(). Isso indicará se a sequência criará ou não elementos significativos da matriz se explodida.

  4. Eu acho que é importante mencionar que, ao explodir incondicionalmente, você está GARANTIDO para gerar uma matriz não vazia. Aqui está a prova: Demonstração Em outras palavras, verificar se a matriz está vazia é completamente inútil - ela estará sempre vazia.

  5. Se sua string NÃO POSSIVELMENTE conter um valor zero (porque, digamos, este é um csv que consiste em IDs que iniciam 1e apenas incrementam), if ($gamerow['players']) {é tudo o que você precisa - fim da história.

  6. ... mas espere, o que você está fazendo depois de determinar o vazio desse valor? Se você tem algo em espera $playerlist, mas está declarando condicionalmente essa variável, corre o risco de usar o valor da linha anterior ou gerar novamente Avisos. Então, você precisa declarar incondicionalmente $playerlistcomo algo ? Se não houver valores reais na cadeia, seu aplicativo se beneficia ao declarar uma matriz vazia? As chances são de que a resposta seja sim. Nesse caso, você pode garantir que a variável seja do tipo matriz, retornando a uma matriz vazia - dessa forma, não importará se você alimentar essa variável em um loop. As seguintes declarações condicionais são todas equivalentes.

    • `if ($ gamerow ['jogadores']) {$ playerlist = explode (',', $ gamerow ['jogadores']); } else {$ playerlist = []; }
    • $playerlist = $gamerow['players'] ? explode(',', $gamerow['players']) : [];

Por que fui tão longe para explicar essa tarefa muito básica?

  1. Eu denunciei quase todas as respostas desta página e é provável que essa resposta receba votos de vingança (isso acontece frequentemente com os denunciantes que defendem este site - se uma resposta tiver votos negativos e nenhum comentário, sempre seja cético).
  2. Eu acho que é importante que o Stackoverflow seja um recurso confiável que não envenene os pesquisadores com desinformação e técnicas abaixo do ideal.
  3. É assim que eu mostro o quanto me importo com os desenvolvedores futuros, para que eles aprendam o como e o porquê, em vez de apenas alimentar uma geração de programadores de copiar e colar.
  4. Costumo usar páginas antigas para fechar novas páginas duplicadas - essa é responsabilidade de voluntários veteranos que sabem como encontrar rapidamente duplicatas. Não posso usar uma página antiga com informações ruins / falsas / subótimas / enganosas como referência, porque então estou prestando um desserviço a um novo pesquisador.
mickmackusa
fonte
@ ptr está aqui.
mickmackusa 29/01
1
empty($gamerow['players'])
Dan McGrath
fonte
algumas vezes você não poderia Saber o valor de chave do elemento da matriz $matches = preg_grep ( "/^$text (\w+)/i" , $array ) ; para verificá-la eu usoif ( count ( $matches ) > 0 )
Salem
Supõe-se que a coluna exista no conjunto de resultados, o que empty()faz muito trabalho.
mickmackusa 28/01
-1

Resolvi esse problema com o seguinte código.

$catArray=array();                          

$catIds=explode(',',$member['cat_id']);
if(!empty($catIds[0])){
foreach($catIds as $cat_id){
$catDetail=$this->Front_Category->get_category_detail($cat_id);
$catArray[]=$catDetail['allData']['cat_title'];
}
echo implode(',',$catArray);
}
Suraj Kumar
fonte
1
Bem-vindo ao Stack Overflow! Obrigado pelo snippet de código, que pode fornecer ajuda imediata e limitada. Uma explicação adequada melhoraria bastante seu valor a longo prazo , descrevendo por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com outras perguntas semelhantes. Edite sua resposta para adicionar alguma explicação, incluindo as suposições que você fez.
31518 sepehr
-3

Isso parece funcionar para todos os casos

if(!empty(sizeof($array)))
Madhu Nair
fonte
3
Isso tem muita sobrecarga. Esta solução não deve ser implementada por nenhum desenvolvedor por qualquer motivo.
Mickmackusa # 10/19
@mickmackusa Ótimo ponto, mas como um novato aprende a identificar quais operações consomem muita sobrecarga? Qual é a oferta ou quais são os critérios de valor nominal para sobrecarga demais sem executar testes de desempenho?
ptrcao 28/01
1
@ ptr existe um "custo" para cada chamada de função. Se uma tarefa puder ser concluída sem uma chamada de função, ela terá um desempenho superior a uma técnica que usa uma chamada de função.
mickmackusa 28/01
Publiquei uma resposta abrangente para esta pergunta. Espero que esclareça quaisquer preocupações que você tenha sobre esta página específica.
mickmackusa 28/01
@mickmackusa Você quis incluir um link para outro post?
ptrcao 29/01
-4

E se:

DepartmentPerSchool = array ();
(vazio (is_array ($ DepartmentPerSchool)))? $ DepartmentPerSchool // ou o eco não está vazio: array ('not set' => 'Not set. Entre em contato com o administrador'); // ou o eco está vazio
Ngatia Frankline
fonte