搜索多维数组的值并返回新数组

时间:2013-08-26 22:59:58

标签: php arrays search multidimensional-array

过去几个小时一直在努力解决这个问题。尝试为数组构建搜索函数,然后吐出一个包含所有具有关键字的数组的新函数。

这是我正在使用的函数,不确定它是否正朝着正确的方向前进,它在数组中返回的数组并不是我想要的。

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
        )

)

我已经在这里阅读了其他一些帖子,做了类似的事情,特别是这一个:How to search by key=>value in a multidimensional array in PHP似乎很接近,除了我想只搜索字符串中的值而不是键。任何帮助是极大的赞赏。

1 个答案:

答案 0 :(得分:1)

你的功能似乎很好,除了:

  • 在调用strpos之前,您不会检查该值是否为字符串
  • 您在结果中分配$ array而不是$ subarray
  • 您不会将$ hasValue变量重置为false
  • 您最后在if语句中为$ hasValue变量赋值boolean true,而不是与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;
}