Борьба с этим в течение последних нескольких часов. Попытка построить функцию поиска для массива, а затем выплюнуть новую, содержащую все массивы с ключевым словом.
Вот функция, с которой я работаю, но не уверен, что она движется в правильном направлении или нет, она возвращает массивы в массивах, которые я не намерен делать.
function search_array($array, $needle) { $results = array(); $hasValue = false; foreach ($array as $subarray) { foreach($subarray as $value){ if(strpos($value,$needle) !== false) $hasValue = true; } if($hasValue = true) $results[] = $array; } return $results; }
Массив, который я ищу, структурирован следующим образом:
Array ( [0] => Array ( [ID] => 27 [title] => Steve Jobs [balance] => $147 [paid_1] => $49 [date_1] => 26 August, 2013 [paid_2] => $49 [date_2] => 26 August, 2013 [paid_3] => $49 [date_3] => 26 August, 2013 ) [1] => Array ( [ID] => 26 [title] => Bill Gates [balance] => $300 [paid_1] => $100 [date_1] => 25 August, 2013 [paid_2] => $100 [date_2] => 25 August, 2013 [paid_3] => $100 [date_3] => 25 August, 2013 ) )
То, что я хотел бы сделать, это использовать данные, введенные из формы поиска, а затем найти любые массивы, в которые введено ключевое слово. Например, поиск «Билл» будет возвращать новый массив и любые другие массивы, содержащие «Билл», структурированные следующим образом:
Array ( [0] => Array ( [ID] => 26 [title] => Bill Gates [balance] => $300 [paid_1] => $100 [date_1] => 25 August, 2013 [paid_2] => $100 [date_2] => 25 August, 2013 [paid_3] => $100 [date_3] => 25 August, 2013 ) )
Я читал некоторые другие сообщения здесь, делая что-то подобное, особенно это: Как искать по ключевому значению в многомерном массиве в PHP, который кажется закрытым, за исключением того, что я хотел бы искать только значение внутри строки и а не ключ. Любая помощь приветствуется.
Ваша функция кажется почти прекрасной, за исключением:
Я считаю, что это должно работать:
function search_array($array, $needle) { $results = array(); foreach ($array as $subarray) { $hasValue = false; foreach($subarray as $value){ if(is_string($value) && strpos($value,$needle) !== false) $hasValue = true; } if($hasValue) $results[] = $subarray; } return $results; }
И еще одна версия, которая спасает вас от прохождения всего подмассива каждый раз:
function search_array($array, $needle) { $results = array(); foreach ($array as $subarray) { foreach($subarray as $value){ if(is_string($value) && strpos($value,$needle) !== false) { $results[] = $subarray; break; } } } return $results; }
Обратите внимание: если вы ищете точное совпадение в одном из значений вместо подстроки, вы можете использовать функцию array_search ():
function search_array($array, $needle) { $results = array(); foreach ($array as $subarray) { if (array_search($needle, $subarray, true) !== false) { $results[] = $subarray; } } return $results; }