Estou escrevendo um criador de consultas SQL usando alguns parâmetros. Em Java, é muito fácil detectar o último elemento de uma matriz de dentro do loop for, apenas verificando a posição atual da matriz com o comprimento da matriz.
for(int i=0; i< arr.length;i++){
boolean isLastElem = i== (arr.length -1) ? true : false;
}
No PHP, eles têm índices não inteiros para acessar matrizes. Portanto, você deve iterar sobre uma matriz usando um loop foreach. Isso se torna problemático quando você precisa tomar alguma decisão (no meu caso, para adicionar ou / e parâmetro durante a criação da consulta).
Estou certo de que deve haver alguma maneira padrão de fazer isso.
Como você resolve isso em PHP?
Respostas:
Parece que você quer algo assim:
Dito isto, você não precisa iterar sobre um "array" usando
foreach
no php.fonte
$numItems = count($arr)
truque não é necessário e reduz a legibilidade - no PHP não há penalidade de desempenho para acessar count ($ arr) a cada vez. O motivo é que a contagem de itens é salva internamente como um campo especial no cabeçalho da matriz e não é calculada em tempo real. Esse truque vem de outras linguagens (C, Java?, ...).Você pode obter o valor da última chave da matriz usando
end(array_keys($array))
e compará-lo com a chave atual:fonte
$lastKey = array_search(end($array), $array);
por que tão complicado?
Isso adicionará a, por trás de cada valor, exceto o último!
fonte
Quando toEnd atinge 0, significa que está na última iteração do loop.
O último valor ainda está disponível após o loop, portanto, se você quiser usá-lo para mais coisas após o loop, é melhor:
Se você não deseja tratar o último valor como loops internos especiais. Isso deve ser mais rápido se você tiver grandes matrizes. (Se você reutilizar a matriz após o loop dentro do mesmo escopo, precisará "copiar" a matriz primeiro).
E para responder à sua pergunta original "no meu caso, para adicionar ou / e parâmetro durante a criação da consulta"; isso fará um loop sobre todos os valores e juntará-os a uma string com "e" entre eles, mas não antes do primeiro valor ou após o último valor:
fonte
$lastValue = array_pop($array);
Obrigado.Já existem muitas respostas, mas vale a pena examinar também os iteradores, especialmente porque foi solicitado um caminho padrão:
Você também pode encontrar algo que funcione mais flexível para outros casos.
fonte
i=0;
e++i;
sempre pareceram hackeados em uma linguagem de script como PHP.Uma maneira poderia ser detectar se o iterador possui
next
. Se não houver outro anexo ao iterador, significa que você está no último loop.fonte
Portanto, se sua matriz possui valores exclusivos, determinar a última iteração é trivial:
Como você vê, isso funciona se o último elemento estiver aparecendo apenas uma vez na matriz, caso contrário, você receberá um alarme falso. Nesse caso, você deve comparar as chaves (que são únicas, com certeza).
Observe também o operador de coparisão estrito, o que é bastante importante neste caso.
fonte
Supondo que você tenha a matriz armazenada em uma variável ...
fonte
para obter o primeiro e o último elemento da matriz foreach
fonte
Você ainda pode usar esse método com matrizes associativas:
fonte
Se você precisar fazer algo para cada elemento, exceto o primeiro ou o último e somente se houver mais de um elemento na matriz, prefiro a solução a seguir.
Sei que existem muitas soluções acima e postadas meses / um ano antes da minha, mas isso é algo que considero bastante elegante por si só. A verificação de cada loop também é uma verificação booleana, em oposição a uma verificação numérica "i = (contagem-1)", que pode permitir menos sobrecarga.
A estrutura do loop pode parecer estranha, mas você pode compará-la com a ordem de thead (início), tfoot (final), tbody (atual) nas tags da tabela HTML.
Por exemplo, em termos de desenvolvimento da web, se você deseja adicionar uma borda inferior a todos os elementos, exceto o último de uma lista não ordenada (ul), poderá adicionar uma borda superior a todos os elementos, exceto o primeiro (o CSS: o primeiro filho, suportado pelo IE7 + e Firefox / Webkit, suporta essa lógica, enquanto que: o último filho não é suportado pelo IE7).
Você pode ficar à vontade para reutilizar a variável $ first para cada loop aninhado e tudo funcionará bem, pois cada loop torna o $ first falso durante o primeiro processo da primeira iteração (para que interrupções / exceções não causem problemas) .
Exemplo de saída:
fonte
Essa deve ser a maneira mais fácil de encontrar o último elemento:
Referência: Link
fonte
Tenho uma forte sensação de que, na raiz desse "problema XY", o OP queria apenas
implode()
funcionar.fonte
Como sua intenção de encontrar a matriz EOF é apenas para a cola. Seja apresentado à tática abaixo. Você não precisa do EOF:
o / p:
fonte
Que tal usar "end"? http://php.net/manual/en/function.end.php
fonte
Parece que você quer algo assim:
fonte
Não adicione vírgula após o último valor:
A matriz:
A função:
O resultado:
lorem, ipsum, dolor, sente-se, amet
fonte
você pode fazer uma contagem ().
ou se você estiver procurando APENAS o último elemento, poderá usar end ().
retorna apenas o último elemento.
e, como se vê, você PODE indexar matrizes php por números inteiros. É perfeitamente feliz com
fonte
$a = array(0=>'A', 2=>'B', 'aaa'=>'C')
. O que você ganha se acessar$a[count($a)-1]
?Você também pode fazer algo assim:
fonte
Eu meio que gosto do seguinte, pois acho que é bastante legal. Vamos supor que estamos criando uma string com separadores entre todos os elementos: por exemplo, a, b, c
fonte
Referência
fonte
Aqui está outra maneira de fazer isso:
fonte
Se eu entendo você, tudo o que você precisa é reverter a matriz e obter o último elemento por um comando pop:
fonte
Você também pode tentar fazer essa consulta ... mostrada aqui com INSERT
fonte
Para scripts de geração de consultas SQL, ou qualquer coisa que execute uma ação diferente para o primeiro ou o último elemento, é muito mais rápido (quase o dobro da velocidade) evitar o uso de verificações desnecessárias de variáveis.
A solução atual aceita usa um loop e uma verificação dentro do loop que será feita a cada_a única_iteração, a maneira correta (rápida) de fazer isso é a seguinte:
Um pequeno benchmark caseiro mostrou o seguinte:
test1: 100000 execuções do modelo morg
tempo: 1869.3430423737 milissegundos
test2: 100000 execuções do modelo, se houver
tempo: 3235.6359958649 milissegundos
fonte
Outro caminho a percorrer é lembrar o resultado do ciclo de loop anterior e usá-lo como resultado final:
fonte
Eu pessoalmente uso esse tipo de construção que permite um uso fácil com os elementos html <ul> e <li>: basta alterar a igualdade de uma outra propriedade ...
A matriz não pode conter itens falsos, mas todos os outros itens que são convertidos no falso booleano.
fonte
Você pode obter o último índice diretamente:
$numItems = count($arr);
echo $arr[$numItems-1];
fonte
fonte
Aqui está minha solução: Simplesmente obtenha a contagem do seu array, menos 1 (já que eles começam em 0).
fonte