Eu tenho duas matrizes em PHP da seguinte maneira:
Pessoas:
Array
(
[0] => 3
[1] => 20
)
Criminosos procurados:
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
)
Como verifico se algum dos elementos People está na matriz Wanted Criminals ?
Neste exemplo, ele deve retornar true
porque 20
está em criminosos procurados .
!empty
não funciona conforme o esperado . Em vez disso, eu useicount()
:!count(array_intersect($people, $criminals));
Há pouco erro em usar array_intersect () e count () (em vez de vazio).
Por exemplo:
fonte
count()
não é considerado alto desempenho (se você se preocupa com micro otimização, que é)se 'vazio' não for a melhor opção, o que dizer disso:
ou
fonte
Esse código é inválido, pois você só pode passar variáveis para construções de linguagem.
empty()
é uma construção de linguagem.Você precisa fazer isso em duas linhas:
fonte
Teste de desempenho para in_array vs array_intersect:
Aqui estão os resultados:
in_array é pelo menos 5 vezes mais rápido. Observe que "quebramos" assim que o resultado é encontrado.
fonte
array_intersect()
.isset
é ainda mais rápido. E você pode usar bool val para ativar ou desativar. Além disso, os valores da pesquisa como chave garantem que não há duplicatas. ´array_intersect avg: 0.52077736854553; matriz média do arquivo: 0,015597295761108; isset avg: 0.0077081203460693´Você também pode usar in_array da seguinte maneira:
Embora array_intersect seja certamente mais conveniente de usar, verifica-se que não é realmente superior em termos de desempenho. Também criei este script:
Em seguida, executei os dois trechos respectivamente em: http://3v4l.org/WGhO7/perf#tabs e http://3v4l.org/g1Hnu/perf#tabs e verifiquei o desempenho de cada um. O interessante é que o tempo total da CPU, ou seja, o tempo do usuário + o tempo do sistema é o mesmo para o PHP5.6 e a memória também é a mesma. O tempo total da CPU no PHP5.4 é menor para in_array do que array_intersect, embora marginalmente.
fonte
in_array
implementação.Aqui está uma maneira de fazer isso depois de pesquisar por um tempo. Eu queria criar um ponto de extremidade da API do Laravel que verifique se um campo está "em uso"; portanto, as informações importantes são: 1) qual tabela de banco de dados? 2) qual coluna DB? e 3) existe um valor nessa coluna que corresponda aos termos da pesquisa?
Sabendo disso, podemos construir nossa matriz associativa:
Então, podemos definir nossos valores que iremos verificar:
Então, podemos usar
array_key_exists()
ein_array()
uns com os outros para executar um, dois etapa de combinação e, em seguida, agir sobre atruthy
condição:Peço desculpas pelo código PHP específico do Laravel, mas deixarei porque acho que você pode lê-lo como pseudo-código. A parte importante são as duas
if
instruções que são executadas de forma síncrona.fonte:
https://php.net/manual/en/function.array-key-exists.php
https://php.net/manual/en/function.in-array.php
A coisa agradável sobre o algoritmo que eu mostrei acima é que você pode fazer um terminal REST, como
GET /in-use/{table}/{column}/{value}
(ondetable
,column
evalue
são variáveis).Você pode ter:
e você pode fazer solicitações GET, como:
GET /in-use/accounts/account_name/Bob's Drywall
(pode ser necessário codificar uri a última parte, mas geralmente não)GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/[email protected]
Observe também que ninguém pode fazer:
GET /in-use/users/password/dogmeat1337
porquepassword
não está listado na sua lista de colunas permitidas parauser
.Boa sorte em sua jornada.
fonte
$SEARCHABLE_TABLE_COLUMNS
! Isso grita por uma injeção - não importa se existe um "construtor de consultas de estrutura ultra-seguro" que tenta mascarar e filtrar as seqüências de tabela e coluna! Na tabela final e nas cadeias de colunas, não podem ser adicionadas via espaço reservado (instruções preparadas) e devem ser inseridas diretamente comoSELECT ... FROM {$table} WHERE {$column} = :placeholder ....
. Ofc depende de adaptadores (mysql, mongo, ...) MAS isso não é um argumento a ser salvo! Lista estática ou nenhuma lista =)