Estoy escribiendo un creador de consultas SQL usando algunos parámetros. En Java, es muy fácil detectar el último elemento de una matriz desde el interior del bucle for simplemente comprobando la posición actual de la matriz con la longitud de la matriz.
for(int i=0; i< arr.length;i++){
boolean isLastElem = i== (arr.length -1) ? true : false;
}
En PHP tienen índices no enteros para acceder a las matrices. Por lo tanto, debe iterar sobre una matriz utilizando un bucle foreach. Esto se vuelve problemático cuando necesita tomar alguna decisión (en mi caso, agregar o parámetro durante la consulta).
Estoy seguro de que debe haber alguna forma estándar de hacerlo.
¿Cómo se resuelve esto en PHP?
Respuestas:
Parece que quieres algo como esto:
Dicho esto, no tienes que iterar sobre una "matriz" usando
foreach
php.fuente
$numItems = count($arr)
el truco no es necesario y reduce la legibilidad: en PHP no hay penalización de rendimiento por acceder al conteo ($ arr) cada vez. La razón es que el recuento de elementos se guarda internamente como un campo especial en el encabezado de la matriz y no se calcula sobre la marcha. Este truco proviene de otros lenguajes (C, Java?, ...).Puede obtener el valor de la última clave de la matriz usando
end(array_keys($array))
y compararlo con la clave actual:fuente
$lastKey = array_search(end($array), $array);
¿Por qué tan complicado?
¡Esto agregará un, detrás de cada valor, excepto el último!
fuente
Cuando toEnd alcanza 0 significa que está en la última iteración del bucle.
El último valor aún está disponible después del ciclo, por lo que si solo desea usarlo para más cosas después del ciclo, esto es mejor:
Si no desea tratar el último valor como bucles internos especiales. Esto debería ser más rápido si tiene matrices grandes. (Si reutiliza la matriz después del ciclo dentro del mismo alcance, primero debe "copiar" la matriz).
Y para responder a su pregunta original "en mi caso, agregar o / y parámetros al crear la consulta"; esto recorrerá todos los valores, luego los unirá en una cadena con "y" entre ellos, pero no antes del primer valor o después del último valor:
fuente
$lastValue = array_pop($array);
Gracias.Ya hay muchas respuestas, pero también vale la pena buscar iteradores, especialmente porque se le ha pedido una forma estándar:
Es posible que también encuentre algo que funcione más flexible para otros casos.
fuente
i=0;
y++i;
siempre me ha parecido hack en un lenguaje de script como PHP.Una forma podría ser detectar si el iterador tiene
next
. Si no hay un próximo adjunto al iterador, significa que está en el último bucle.fuente
Entonces, si su matriz tiene valores de matriz únicos, entonces determinar la última iteración es trivial:
Como puede ver, esto funciona si el último elemento aparece solo una vez en la matriz; de lo contrario, obtendrá una falsa alarma. En caso contrario, debe comparar las claves (que son únicas de seguro).
También tenga en cuenta el operador de copago estricto, que es bastante importante en este caso.
fuente
Suponiendo que tiene la matriz almacenada en una variable ...
fuente
para obtener el primer y el último elemento de la matriz foreach
fuente
Todavía puede usar ese método con matrices asociativas:
fuente
Si necesita hacer algo para cada elemento, excepto el primero o el último y solo si hay más de un elemento en la matriz, prefiero la siguiente solución.
Sé que hay muchas soluciones anteriores y publicadas meses / un año antes que la mía, pero esto es algo que creo que es bastante elegante en sí mismo. La comprobación de cada bucle también es una comprobación booleana en lugar de una comprobación numérica "i = (cuenta-1)", que puede permitir menos gastos generales.
La estructura del bucle puede parecer incómoda, pero puede compararla con el orden de thead (principio), tfoot (final), tbody (actual) en las etiquetas de tabla HTML.
Por ejemplo, en términos de desarrollo web, si desea agregar un borde inferior a cada elemento, excepto el último en una lista desordenada (ul), puede agregar un borde superior a cada elemento excepto el primero (el CSS: first-child, compatible con IE7 + y Firefox / Webkit admite esta lógica, mientras que: last-child no es compatible con IE7).
Puede sentirse libre de reutilizar la variable $ first para todos y cada uno de los bucles anidados y las cosas funcionarán bien, ya que cada bucle hace que $ first sea falso durante el primer proceso de la primera iteración (por lo que los saltos / excepciones no causarán problemas) .
Salida de ejemplo:
fuente
Esta debería ser la manera fácil de encontrar el último elemento:
Referencia: Enlace
fuente
Tengo la fuerte sensación de que en la raíz de este "problema XY" el OP solo quería
implode()
funcionar.fuente
Como su intención de encontrar la matriz EOF es solo para el pegamento. Conozca la siguiente táctica. No necesita requerir el EOF:
o / p:
fuente
¿Qué tal usar "fin"? http://php.net/manual/en/function.end.php
fuente
Parece que quieres algo como esto:
fuente
No agregue una coma después del último valor:
La matriz:
La función:
El resultado:
lorem, ipsum, dolor, sentarse, amet
fuente
puedes hacer un conteo ().
o si está buscando SOLO el último elemento, puede usar end ().
devuelve solo el último elemento.
y, como resultado, PUEDES indexar matrices php por enteros. Es perfectamente feliz con
fuente
$a = array(0=>'A', 2=>'B', 'aaa'=>'C')
. ¿Qué obtienes si accedes$a[count($a)-1]
?También podrías hacer algo como esto:
fuente
Me gusta un poco lo siguiente, ya que siento que es bastante ordenado. Supongamos que estamos creando una cadena con separadores entre todos los elementos: por ejemplo, a, b, c
fuente
Referencia
fuente
Aquí hay otra forma de hacerlo:
fuente
Si te entiendo, todo lo que necesitas es invertir la matriz y obtener el último elemento mediante un comando pop:
fuente
También puede probar esto para hacer su consulta ... que se muestra aquí con INSERT
fuente
Para los scripts de generación de consultas SQL, o cualquier cosa que realice una acción diferente para el primer o el último elemento, es mucho más rápido (casi el doble de rápido) evitar el uso de comprobaciones de variables innecesarias.
La solución actual aceptada utiliza un bucle y una verificación dentro del bucle que se realizará en cada_site_iteración, la forma correcta (rápida) de hacer esto es la siguiente:
Un pequeño punto de referencia casero mostró lo siguiente:
test1: 100000 ejecuciones del modelo morg
tiempo: 1869.3430423737 milisegundos
test2: 100000 ejecuciones de modelo si duran
tiempo: 3235.6359958649 milisegundos
fuente
Otra forma de hacerlo es recordar el resultado del ciclo de bucle anterior y usarlo como resultado final:
fuente
Personalmente utilizo este tipo de construcción que permite un uso fácil con los elementos html <ul> y <li>: simplemente cambie la igualdad para otra propiedad ...
La matriz no puede contener elementos falsos, pero todos los demás elementos que se convierten en el booleano falso.
fuente
Puede obtener directamente el último índice de la siguiente manera:
$numItems = count($arr);
echo $arr[$numItems-1];
fuente
fuente
Aquí está mi solución: simplemente obtenga el recuento de su matriz, menos 1 (ya que comienzan en 0).
fuente