Поиск многомерного массива для значения и возврат нового массива

Борьба с этим в течение последних нескольких часов. Попытка построить функцию поиска для массива, а затем выплюнуть новую, содержащую все массивы с ключевым словом.

Вот функция, с которой я работаю, но не уверен, что она движется в правильном направлении или нет, она возвращает массивы в массивах, которые я не намерен делать.

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, который кажется закрытым, за исключением того, что я хотел бы искать только значение внутри строки и а не ключ. Любая помощь приветствуется.

Solutions Collecting From Web of "Поиск многомерного массива для значения и возврат нового массива"

Ваша функция кажется почти прекрасной, за исключением:

  • Вы не проверяете, является ли значение строкой перед вызовом strpos на ней
  • Вы назначаете $ array в своем результате вместо $ subarray
  • Вы не сбрасываете переменную $ hasValue в false
  • Вы присваиваете значение boolean true переменной $ hasValue в выражении if в конце, вместо сравнения с true.

Я считаю, что это должно работать:

 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; }