Tengo dos matrices en PHP de la siguiente manera:
Personas:
Array
(
[0] => 3
[1] => 20
)
Criminales buscados:
Array
(
[0] => 2
[1] => 4
[2] => 8
[3] => 11
[4] => 12
[5] => 13
[6] => 14
[7] => 15
[8] => 16
[9] => 17
[10] => 18
[11] => 19
[12] => 20
)
¿Cómo verifico si alguno de los elementos Personas está en la matriz de Wanted Criminals ?
En este ejemplo, debería regresar true
porque 20
está en Wanted Criminals .
!empty
no funciona como se esperaba . En cambio, usécount()
:!count(array_intersect($people, $criminals));
No hay nada de malo en usar array_intersect () y count () (en lugar de vacío).
Por ejemplo:
fuente
count()
no se considera eficiente (si te importa la micro optimización, eso es)Si 'vacío' no es la mejor opción, ¿qué pasa con esto?
o
fuente
Ese código no es válido ya que solo puede pasar variables a construcciones de lenguaje.
empty()
Es una construcción del lenguaje.Tienes que hacer esto en dos líneas:
fuente
Prueba de rendimiento para in_array vs array_intersect:
Aquí están los resultados:
in_array es al menos 5 veces más rápido. Tenga en cuenta que nos "rompemos" tan pronto como se encuentre un resultado.
fuente
array_intersect()
.isset
Es aún más rápido. Y podría usar bool val para habilitar o deshabilitar. Además, los valores de búsqueda como clave se aseguran de no tener duplicados. ´array_intersect avg: 0.52077736854553; en_array promedio: 0.015597295761108; promedio de isset: 0.0077081203460693´También puede usar in_array de la siguiente manera:
Si bien array_intersect es ciertamente más conveniente de usar, resulta que no es realmente superior en términos de rendimiento. También creé este script:
Luego, ejecuté ambos fragmentos respectivamente en: http://3v4l.org/WGhO7/perf#tabs y http://3v4l.org/g1Hnu/perf#tabs y verifiqué el rendimiento de cada uno. Lo interesante es que el tiempo total de la CPU, es decir, el tiempo del usuario + el tiempo del sistema es el mismo para PHP5.6 y la memoria también es la misma. El tiempo total de CPU en PHP5.4 es menor para in_array que array_intersect, aunque marginalmente.
fuente
in_array
implementación.He aquí una forma en que lo hago después de investigarlo por un tiempo. Quería hacer un punto final de API Laravel que verifique si un campo está "en uso", por lo que la información importante es: 1) ¿qué tabla de DB? 2) ¿Qué columna de DB? y 3) ¿hay un valor en esa columna que coincida con los términos de búsqueda?
Sabiendo esto, podemos construir nuestra matriz asociativa:
Luego, podemos establecer nuestros valores que verificaremos:
Luego, podemos usar
array_key_exists()
yin_array()
entre sí para ejecutar un combo de uno, dos pasos y luego actuar según latruthy
condición:Pido disculpas por el código PHP específico de Laravel, pero lo dejaré porque creo que puede leerlo como pseudocódigo. La parte importante son las dos
if
declaraciones que se ejecutan sincrónicamente.fuente:
https://php.net/manual/en/function.array-key-exists.php
https://php.net/manual/en/function.in-array.php
Lo bueno del algoritmo que he mostrado antes es que se puede hacer un extremo REST como
GET /in-use/{table}/{column}/{value}
(dondetable
,column
yvalue
son variables).Podrías tener:
y luego puede realizar solicitudes GET como:
GET /in-use/accounts/account_name/Bob's Drywall
(es posible que deba codificar uri en la última parte, pero generalmente no)GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/[email protected]
Tenga en cuenta también que nadie puede hacer:
GET /in-use/users/password/dogmeat1337
porquepassword
no aparece en su lista de columnas permitidas parauser
.Buena suerte en tu viaje.
fuente
$SEARCHABLE_TABLE_COLUMNS
! Esto exige una inyección, no importa si hay un "generador de consultas de marco ultra seguro" que intente enmascarar y filtrar cadenas de tablas y columnas. Al final, las cadenas de tabla y columna no se pueden agregar a través de un marcador de posición (declaraciones preparadas) y se deben insertar directamente comoSELECT ... FROM {$table} WHERE {$column} = :placeholder ....
. Ofc depende de los adaptadores (mysql, mongo, ...) ¡PERO ese no es un argumento para salvar! Pls estática o sin lista =)