Поиск PHP в многомерном массиве. не зная ключа

Множество:

$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'abc.jpg'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'Michael.jpg'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'xyz.jpg'
    )
);

Значение поиска:

Michael

Ожидаемый результат:

$userdb = array(
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'Michael.jpg'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'xyz.jpg'
    )
);

Поскольку вы можете проверить, чего я хочу, может ли кто-нибудь сказать мне, как я могу достичь этого результата с помощью PHP. Меня не волнует, находится ли мой поисковый запрос в ключе 'uid', 'name' или 'pic_square', но я хочу получать массив всякий раз, когда мой результат поиска соответствует. Есть ли встроенная функция, которая может достичь такого результата?

Не могли бы вы показать усилия по кодированию, которые вы пробовали до сих пор?

WM-SH-PD-TV-FC 02.05.2018 07:42

Мне кажется, что это foreach, вложенный в другой foreach ...

Romeo Sierra 02.05.2018 07:43

@AlivetoDie у меня в голове пусто, я ничего не пробовал. Помогите, пожалуйста.

shah rushabh 02.05.2018 07:46

@RomeoSierra Любой альтернативный способ, потому что элемента слишком много.

shah rushabh 02.05.2018 07:47

@shahrushabh Здесь все не так.

Romeo Sierra 02.05.2018 07:48

У вас много незакрытые вопросы, верно? Ты умеешь делать? См. meta.stackexchange.com/questions/5234/… Спасибо всем, кто отвечает, и будущим читателям :)

Syscall 02.05.2018 08:21

@AlivetoDie Да, братан, я проверил

shah rushabh 02.05.2018 11:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
790
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Это должно помочь.

foreach($userdb as $i=>$r){
    foreach($r as $j=>$v){
        #if ($v matches the querystring)
            #return $r / append $r to a match list
    }
}

Но ОБРАТИТЕ ВНИМАНИЕ, ЧТО, поскольку нет индексации и все такое, это будет работать в О (N ^ 2), что является наихудшим случаем ...

РЕДАКТИРОВАТЬ

После некоторых исследований пришло следующее решение.

$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'abc.jpg'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'Michael.jpg'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'xyz.jpg'
    )
);

$search = "Michael";

$out = array_filter($userdb, function($item) use($search) {
    foreach($item as $k=>$v){
        if (preg_match("/$search/", $v) == 1){
            return true;
        }
    }
});

echo json_encode($out);

В решении используется функция array_filter (настоящим подтверждается Ответ системного вызова, это был указатель для меня для дальнейшего исследования array_filter) для уменьшения массива с помощью фильтра, где фильтр представляет собой preg_match, выполняемый для каждого атрибута элементов ассоциативного массива. Если совпадение найдено, оно возвращает истину, что добавит соответствующий элемент в $out.

2 foreach () вообще не требуется.

WM-SH-PD-TV-FC 02.05.2018 08:01

Это только если вы точно знаете, сколько элементов вы уже знаю все ключи искали .. Вы проголосовали против этого ??

Romeo Sierra 02.05.2018 08:24

Я просто из любопытства спросил .. :) В любом случае, для всех вышеперечисленных подходов вам необходимо заранее знать все ключи. Если мы не знаем ключей или если ключи в ассоциативных массивах меняются от одного к другому, у вас могут быть проблемы ...

Romeo Sierra 02.05.2018 08:29
Ответ принят как подходящий

Очень простое решение для применения простого foreach() с strpos ()

1. перебрать массив с помощью foreach()

2.Проверьте, существует ли значение поиска в любом из трех id, name,pic_square или нет? если да, то добавьте весь этот подмассив в новый массив.

3. Этот новый массив - ваш желаемый результат.

$search_value = 'Michael';


$final_array = [];

foreach($userdb as $userd){
  if (strpos($userd['uid'],$search_value)!== false || strpos($userd['name'],$search_value)!== false || strpos($userd['pic_square'],$search_value)!== false){

     $final_array[] = $userd;
  }

}

print_r($final_array);

Выход: - https://eval.in/997896

Братан, спасибо за решение, но я использовал метод array_search, он быстрый. Тот же шаг, что и я.

shah rushabh 02.05.2018 11:10

@shahrushabh рад вам помочь :) :)

WM-SH-PD-TV-FC 02.05.2018 11:18

Другой способ - использовать array_filter() для удаления элементов, не соответствующих вашему запросу.

$userdb = array(
    array('uid' => '100', 'name' => 'Sandra Shush', 'pic_square' => 'abc.jpg'),
    array('uid' => '5465', 'name' => 'Stefanie Mcmohn', 'pic_square' => 'Michael.jpg'),
    array('uid' => '40489', 'name' => 'Michael', 'pic_square' => 'xyz.jpg')
);

$search = 'Michael';
$out = array_filter($userdb, function($item) use($search) {
    return $item['name'] == $search || strpos($item['pic_square'], $search) !== false;
});
print_r($out);

Выход:

Array (
    [1] => Array (
            [uid] => 5465
            [name] => Stefanie Mcmohn
            [pic_square] => Michael.jpg
        )
    [2] => Array (
            [uid] => 40489
            [name] => Michael
            [pic_square] => xyz.jpg
        )
)
$item['name'] == $search также должен использовать strpos(), иначе он не будет работать с таким именем, как Michael Dominic ..... У меня есть только это предположение. Имейте в виду, что я не сказал, что вы ошибаетесь.
WM-SH-PD-TV-FC 02.05.2018 07:53

Вы правы, живы. Здесь я использую полное совпадение, чтобы показать несколько возможностей. Но я думаю, что strpos для имени, вероятно, более полезен. Спасибо за ваш комментарий.

Syscall 02.05.2018 07:55

Вы можете использовать preg_grep для поиска в произвольном сравнении.

$search = "Michael";
Foreach($userdb as $key => $arr){
    If(preg_grep("/" . $search ."/", $arr)){
        $res[] = $userdb[$key];
    }
}

Var_dump($res);

Я просматриваю массив, и если совпадение достигается с помощью preg_grep, оно добавляется в массив результатов.

https://3v4l.org/BPJBC

Preg_grep будет искать по всему массиву, а не только по жестко запрограммированным элементам. Очевидно, это может быть как хорошо, так и плохо.

В качестве примера, если ваша БД расширяется с помощью ключа 'alias', preg_grep будет искать его без необходимости изменять код.

См. Пример здесь:
https://3v4l.org/lOao3

Другие вопросы по теме