переход
В последнее время ThinkPHP 5.1 использовался для ряда разработок, потому что он раньше разрабатывался с помощью Laravel, например, небольшая проблема в названии, которую легко реализовать в Laravel. Используйте метод array_first для прямого поиска.
Быстрая реализация
Но ThinkPHP не предоставляет аналогичного метода для быстрой обработки, поэтому есть необходимость в повторной сборке колес? Первый способ, о котором я думаю, – это использовать array_search. Однако официальное решение, представленное в этом методе, предназначено только для простого одномерного поиска по массиву, и результат, возвращаемый индексом, не является найденным результатом. Мы также можем извлекать элементы с помощью индекса. Новый метод array_column, представленный PHP 5.5, может легко реализовать здесь пользовательский интерфейс двумерного поиска. Примечание предоставляет нам небольшой пример.
$userdb=Array
(
(0) => Array
(
(uid) => '100',
(name) => 'Sandra Shush',
(url) => 'urlof100'
),
(1) => Array
(
(uid) => '5465',
(name) => 'Stefanie Mcmohn',
(pic_square) => 'urlof100'
),
(2) => Array
(
(uid) => '40489',
(name) => 'Michael',
(pic_square) => 'urlof40489'
)
);
$key = array_search(40489, array_column($userdb, 'uid'));И это принесло более 800 благодарностей, так что, возможно, вы почувствуете, что можете просто взять индекс таким образом, а затем удалить его с помощью индекса.
Некоторые из них
Однако, если вы снова посмотрите вниз, вы увидите еще одну заметку пользователя, в которой говорится, что, когда мы используем этот метод для достижения двумерного поиска, ваша версия PHP должна быть 5,5+, и в то же время автор сообщает нам об этом.
Поскольку array_column() создаст результирующий массив; он не сохранит ключи вашего многомерного массива. Поэтому, если вы сверитесь со своими ключами, это не сработает. Переверните его: Потому что array_column() создаст новый массив; он не сохранит исходный ключ многомерного массива. Поэтому, если вы проверите свой ключ, он выйдет из строя.
Затем автор также предоставляет нам a.
$people = array(
2 => array(
'name' => 'John',
'fav_color' => 'green'
),
5 => array(
'name' => 'Samuel',
'fav_color' => 'blue'
)
);
$found_key = array_search('blue', array_column($people, 'fav_color')); // 1
// Here, you could expect that the $found_key would be "5" but it's NOT. It will be 1. Since it's the second element of the produced array by the array_column() function.
// Flip it over: Here, you expect $found_key to be "5", but it's not, it's going to be 1. Because it's the second element of the array generated by the array_column() function.
// In addition, the author mentions that
// Secondly, if your array is big, I would recommend you to first assign a new variable so that it wouldn't call array_column() for each element it searches. For a better performance, you could do;
// Flip it over: Second, if your array is large, I recommend that you first assign a new variable so that it does not call array_column() for every element it searches for. In order to get better performance, you can do it.
$colors = array_column($people, 'fav_color');
$found_key = array_search('blue', $colors);Прочитав эти советы, вы нашли яму, но это еще не конец, потому что, если данные недостаточно чисты, вы используете array_search Реализованная функциональность может быть ограничена in_array . И даже если мы здесь, мы столкнемся с другой ямой. Сначала посмотри на яму.
Давайте угадаем, каким будет $found_key. Ответ таков: 2 。 ??? Потому что при выполнении array_column() третий элемент, uid, аннотируется в данных ключом 3, и PHP игнорирует его и не сохраняет позицию индекса, поэтому в результате получается только три элемента, а четвертый заменяется вверх, потому что индекс массива начинается с 0, поэтому 2 эквивалентно третьему элементу.
Как все это делали?
оставайтесь array_search В области записной книжки пользователя, мы видим, что многие из них возвращаются после циклов массива и сравнений, таких как это, но это также сталкивается с некоторыми ограничениями. В настоящее время мы думаем о том, что Laravel передает автономию вызывающему абоненту, которая обрабатывается вызывающим абонентом анонимным методом и возвращает значение bool для обработки.
Пока что оглянитесь на метод array_first от Laravel. Из исходного кода Laravel мы видим, что array_first является оболочкой метода Arr:: first. Здесь мы можем увидеть, как реализован Laravel. В этом небольшом фрагменте кода мы можем увидеть другой метод, value (), который позволяет определить, является ли он анонимным методом или нет, и если да, то выполнить метод и вернуть, а не напрямую.
public static function first($array, callable $callback = null, $default = null)
{
if (is_null($callback)) {
if (empty($array)) {
return value($default);
}
foreach ($array as $item) {
return $item;
}
}
foreach ($array as $key => $value) {
if (call_user_func($callback, $value, $key)) {
return $value;
}
}
return value($default);
}
if (! function_exists('value')) {
/**
* Return the default value of the given value.
*
* @param mixed $value
* @return mixed
*/
function value($value)
{
return $value instanceof Closure ? $value() : $value;
}
}Смотрите здесь, почти полная реализация, здесь также подумали о другом проекте, связанном с вспомогательными функциями: Подчеркивание. PHP Это библиотека методов PHP, или JS underscore.js и загружает , ,//реализацию PHP. В этом проекте мы видим, как его реализовать.
public static function find($array, Closure $closure)
{
foreach ($array as $key => $value) {
if ($closure($value, $key)) {
return $value;
}
}
return;
}Реализация здесь проще и в конечном итоге достигает желаемых результатов.