过去几个小时一直在为此而挣扎。试图为一个数组构建一个搜索函数,然后抛出一个包含所有具有关键字的数组的新函数。
这是我正在使用的函数,不确定它是否朝着正确的方向前进,它正在返回数组中的数组,这不是我想要的。
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
)
)
我希望使用从搜索表单中输入的数据,然后找到任何输入了关键字的数组。例如,搜索"Bill"将返回一个新数组和任何其他包含"Bill"的数组,其结构如下:
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中多维数组中的值,这似乎很接近,只是我想只按字符串中的值搜索,而不按键搜索。非常感谢您的帮助。
您的功能看起来几乎很好,除了:
- 在对该值调用strpos之前,不检查该值是否为字符串
- 在结果中指定$array,而不是$subarray
- 您没有将$hasValue变量重置为false
- 在if语句的末尾,您将boolean值true赋值给$hasValue变量,而不是与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;
}