Рубрики
Uncategorized

Array_find в многомерном массиве PHP

Автор оригинала: David Wong.

переход

В последнее время 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 . И даже если мы здесь, мы столкнемся с другой ямой. Сначала посмотри на яму.

php 
$userdb = array(
    0 => array(
            'uid' => 100,
            'name' => 'Sandra Shush',
            'url' => 'urlof100'
        ),
 
    '8' => array(
            'uid' => 5465,
            'name' => 'Stefanie Mcmohn',
            'pic_square' => 'urlof100'
        ),
 
    '3' => Array(
            // 'uid' => 5555,
            'name' => 'Michael',
            'pic_square' => 'urlof40489'
        ),
 
    '6' => Array(
            'uid' => 40489,
            'name' => 'Michael',
            'pic_square' => 'urlof40489'
        )
);
 
$found_key = array_search(40489, array_column($userdb, 'uid'));

Давайте угадаем, каким будет $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;
    }

Реализация здесь проще и в конечном итоге достигает желаемых результатов.