У меня есть два массива в PHP:
Люди:
Array
(
[0] => 3
[1] => 20
)
Разыскиваемые преступники:
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
)
Как я могу проверить , если какой - либо из народных элементов в розыске массива?
В этом примере он должен вернуться, true
потому что 20
находится в розыске преступников .
!empty
это не работает должным образом . Вместо этого я использовалcount()
:!count(array_intersect($people, $criminals));
Нет ничего плохого в использовании array_intersect () и count () (вместо empty).
Например:
источник
count()
он не считается производительным (если вы заботитесь о микрооптимизации)если «пустой» - не лучший выбор, как насчет этого:
или
источник
Этот код недействителен, поскольку вы можете передавать переменные только в языковые конструкции.
empty()
это языковая конструкция.Это нужно сделать в две строчки:
источник
Тест производительности для in_array vs array_intersect:
Вот результаты:
in_array как минимум в 5 раз быстрее. Обратите внимание, что мы «ломаемся», как только находим результат.
источник
array_intersect()
.isset
еще быстрее. И вы можете использовать bool val для включения или отключения. Также убедитесь, что значения поиска в качестве ключа не имеют дубликатов. ´array_intersect avg: 0.52077736854553; in_array avg: 0,015597295761108; isset avg: 0.0077081203460693´Вы также можете использовать in_array следующим образом:
Хотя array_intersect, безусловно, более удобен в использовании, оказывается, что он не намного лучше с точки зрения производительности. Я тоже создал этот скрипт:
Затем я запустил оба фрагмента соответственно по адресу: http://3v4l.org/WGhO7/perf#tabs и http://3v4l.org/g1Hnu/perf#tabs и проверил производительность каждого из них. Интересно то, что общее время процессора, т.е. время пользователя + системное время, одинаково для PHP5.6, и память также такая же. Общее время процессора в PHP5.4 меньше для in_array, чем array_intersect, хотя и незначительно.
источник
in_array
реализации.Вот как я это делаю после некоторого исследования. Я хотел создать конечную точку API Laravel, которая проверяет, "используется ли" поле, поэтому важная информация: 1) какая таблица БД? 2) какой столбец БД? и 3) есть ли в этом столбце значение, соответствующее условиям поиска?
Зная это, мы можем построить наш ассоциативный массив:
Затем мы можем установить наши значения, которые мы будем проверять:
Затем мы можем использовать
array_key_exists()
и другin_array()
с другом для выполнения одно-, двухэтапного комбо, а затем действовать в соответствии сtruthy
условием:Прошу прощения за специфичный для Laravel PHP-код, но я оставлю его, потому что я думаю, вы можете прочитать его как псевдокод. Важная часть - это два
if
оператора, которые выполняются синхронно.источник:
https://php.net/manual/en/function.array-key-exists.php
https://php.net/manual/en/function.in-array.php
Хорошая вещь об алгоритме , который я показал выше, что вы можете сделать REST конечной точки , такие как
GET /in-use/{table}/{column}/{value}
(гдеtable
,column
иvalue
переменные).У вас могло быть:
а затем вы можете делать запросы GET, такие как:
GET /in-use/accounts/account_name/Bob's Drywall
(вам может потребоваться кодирование uri последней части, но обычно нет)GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/alice@bob.com
Заметьте также, что никто не может:
GET /in-use/users/password/dogmeat1337
потому чтоpassword
не указан в вашем списке разрешенных столбцов дляuser
.Удачи тебе в пути.
источник
$SEARCHABLE_TABLE_COLUMNS
! Это требует инъекции - независимо от того, есть ли между ними «сверхбезопасный конструктор запросов», который пытается замаскировать и отфильтровать строки таблиц и столбцов! В конце строки таблицы и столбца не могут быть добавлены через заполнитель (подготовленные операторы) и должны быть вставлены напрямую, какSELECT ... FROM {$table} WHERE {$column} = :placeholder ....
. Ofc зависит от адаптеров (mysql, mongo, ...), НО это не аргумент для сохранения! Pls static or no list =)