- Qual é a maneira mais eficiente de verificar se uma matriz é uma matriz plana de valores primitivos ou se é uma matriz multidimensional ?
- Existe alguma maneira de fazer isso sem realmente percorrer uma matriz e rodar
is_array()
em cada um de seus elementos?
137
Respostas:
A resposta curta é não, você não pode fazê-lo sem pelo menos repetir implicitamente se a 'segunda dimensão' pode estar em qualquer lugar. Se tiver que estar no primeiro item, você faria
Mas, a maneira geral mais eficiente que eu poderia encontrar é usar um loop foreach na matriz, fazendo um curto-circuito sempre que um hit é encontrado (pelo menos o loop implícito é melhor que o direto para ()):
Loop implícito, mas não podemos fazer um curto-circuito assim que uma correspondência for encontrada ...
fonte
is_multi()
otimizar o código fazendoreturn count($rv)>0
Use count () duas vezes; uma vez no modo padrão e uma vez no modo recursivo. Se os valores corresponderem, a matriz não é multidimensional, pois uma matriz multidimensional teria uma contagem recursiva mais alta.
Este segundo valor da opção
mode
foi adicionado no PHP 4.2.0. Nos documentos do PHP :No entanto, este método não detecta
array(array())
.fonte
Para PHP 4.2.0 ou mais recente:
fonte
array(array())
ouarray(array(), array())
também. Geralmente, se uma matriz interna estiver vazia, a contagem recursiva adicionará corretamente 0 a ela, fazendo com que ela corresponda à contagem normal.Eu acho que esse é o caminho mais direto e é o estado da arte:
fonte
Você pode simplesmente executar isso:
Se o parâmetro do modo opcional estiver definido como
COUNT_RECURSIVE
(ou 1), count () contará recursivamente a matriz. Isso é particularmente útil para contar todos os elementos de uma matriz multidimensional.Se for o mesmo, significa que não há subníveis em nenhum lugar. Fácil e rápido!
fonte
if(count($tasks_by_date) !== count($tasks_by_date, 1))
!==
costumava ver é o subnível. Para teorias que possam estar procurando algo semelhante ... etc.!==
Você pode verificar
is_array()
o primeiro elemento, supondo que se o primeiro elemento de uma matriz for uma matriz, o restante deles também será.fonte
if( is_array(current($arr)) ) { // is multidimensional }
Todas as ótimas respostas ... aqui estão minhas três linhas que eu estou sempre usando
fonte
Esta função retornará o número int de dimensões da matriz (roubadas daqui ).
fonte
Acho que você descobrirá que essa função é a maneira mais simples, eficiente e rápida.
Você pode testá-lo assim:
fonte
foreach($a as $v) is_array($v) ? return TRUE : return FALSE;
foreach($a as $v) return is_array($v) ? true : false;
Após o PHP 7, você poderia simplesmente fazer:
fonte
Você também pode fazer uma verificação simples como esta:
fonte
Tente da seguinte maneira
fonte
Mesmo isso funciona
Se false, é uma matriz de dimensão única, se true, é uma matriz de dimensões múltiplas .
current fornecerá o primeiro elemento da sua matriz e verificará se o primeiro elemento é uma matriz ou não pela função is_array .
fonte
Não use COUNT_RECURSIVE
clique neste site para saber por que
use rsort e depois use isset
fonte
No meu caso. Eu preso em variar condição estranha.
1º caso =
array("data"=> "name");
2º caso =
array("data"=> array("name"=>"username","fname"=>"fname"));
Mas se
data
tiver matriz em vez de valor, a função sizeof () ou count () não funcionará para essa condição. Então eu crio uma função personalizada para verificar.Se o primeiro índice da matriz tiver valor, ele retornará "apenas valor".
Mas se o índice tiver matriz em vez de valor, ele retornará "tem matriz"
.
Agradecimentos especiais a Vinko Vrsalovic
fonte
Eu acho que este é elegante (adereços para outro usuário não sei o nome de usuário):
fonte
Todos os métodos acima são complexos demais para serem implementados rapidamente. Se uma matriz é plana, o teste do primeiro elemento deve retornar uma primitiva, por exemplo, int, string etc. Se for multidimensional, deve retornar uma matriz. Por extensão, você pode usar esse liner de maneira rápida e limpa.
se isso retornar verdadeiro, a matriz é multidimensional. Caso contrário, é plana. Apenas para observar, é muito raro que matrizes tenham dimensões diferentes, por exemplo, se você estiver gerando dados de um modelo, ele sempre terá o mesmo tipo de estrutura multidimensional ou plana que pode ser atravessada por loops. Caso contrário, você o construiu manualmente, o que significa que você sabe onde tudo estará e simplesmente funciona sem a necessidade de escrever um algoritmo de loop
fonte
array_shift()
, pois ele remove o primeiro elemento e também redefine as teclas numéricas! Melhor usocurrent()
se ainda coçar para uma frase.Além das respostas anteriores e dependendo do esquema da matriz que você deseja verificar:
fonte
É tão simples quanto
fonte
Aqui está um belo forro. Ele itera sobre cada chave para verificar se o valor nessa chave é uma matriz. Isso garantirá a verdadeira
fonte
fonte
if (isset($array[0])) { }
. Se você tem certeza índices do array começar do 0* apenas para matrizes com índice numérico
fonte
A função print_r nativa retorna uma sequência legível por humanos. Apenas conte as instâncias "Matriz".
experimentar...
Na minha caixa, "is_multi levou 0,83681297302246 segundos em 500000 vezes"
Cortesia: Ruach HaKodesh
fonte
fonte
Sem loops, puro e simples.
Funciona também com matrizes associadas, não apenas matrizes numéricas, que não podem conter 0 (como no exemplo anterior, seria emitido um aviso se a matriz não tivesse um 0.)
fonte