Множество:
$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', но я хочу получать массив всякий раз, когда мой результат поиска соответствует. Есть ли встроенная функция, которая может достичь такого результата?
Мне кажется, что это foreach
, вложенный в другой foreach
...
@AlivetoDie у меня в голове пусто, я ничего не пробовал. Помогите, пожалуйста.
@RomeoSierra Любой альтернативный способ, потому что элемента слишком много.
@shahrushabh Здесь все не так.
У вас много незакрытые вопросы, верно? Ты умеешь делать? См. meta.stackexchange.com/questions/5234/… Спасибо всем, кто отвечает, и будущим читателям :)
@AlivetoDie Да, братан, я проверил
Это должно помочь.
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 () вообще не требуется.
Это только если вы точно знаете, сколько элементов вы уже знаю все ключи искали .. Вы проголосовали против этого ??
Я просто из любопытства спросил .. :) В любом случае, для всех вышеперечисленных подходов вам необходимо заранее знать все ключи. Если мы не знаем ключей или если ключи в ассоциативных массивах меняются от одного к другому, у вас могут быть проблемы ...
Очень простое решение для применения простого 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, он быстрый. Тот же шаг, что и я.
@shahrushabh рад вам помочь :) :)
Другой способ - использовать 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
..... У меня есть только это предположение. Имейте в виду, что я не сказал, что вы ошибаетесь.
Вы правы, живы. Здесь я использую полное совпадение, чтобы показать несколько возможностей. Но я думаю, что strpos для имени, вероятно, более полезен. Спасибо за ваш комментарий.
Вы можете использовать preg_grep для поиска в произвольном сравнении.
$search = "Michael";
Foreach($userdb as $key => $arr){
If(preg_grep("/" . $search ."/", $arr)){
$res[] = $userdb[$key];
}
}
Var_dump($res);
Я просматриваю массив, и если совпадение достигается с помощью preg_grep, оно добавляется в массив результатов.
Preg_grep будет искать по всему массиву, а не только по жестко запрограммированным элементам. Очевидно, это может быть как хорошо, так и плохо.
В качестве примера, если ваша БД расширяется с помощью ключа 'alias', preg_grep будет искать его без необходимости изменять код.
См. Пример здесь:
https://3v4l.org/lOao3
Не могли бы вы показать усилия по кодированию, которые вы пробовали до сих пор?