在多维数组中搜索多个特定值

时间:2019-02-23 13:47:39

标签: php

我有一个多维数组,看起来像这样:

Array
(
    [0] => Array
            (
                [day] => Every Sunday
                [time] => 08:00
                [form] => normal
            )

    [1] => Array
            (
                [day] => Every Monday
                [time] => 10:30
                [form] => special 
            )

    [2] => Array
            (
                [day] => Every Wednesday
                [time] => 17:00
                [form] => normal
            )
)

我想检查一下是否包含特定日期。例如,我要检查它是否包含星期一和星期日。

使用array_search可以正常工作一天。例如。如果我只想检查星期天:

array_search('Sunday', array_column($times, 'day'));

但是如果我经过一天以上并尝试搜索星期日和星期一,它什么也不会返回:

array_search(array('Sunday', 'Monday'), array_column($times, 'day'));

还有另一种方法,最好不要使用for循环遍历所有内容吗?

3 个答案:

答案 0 :(得分:0)

您的时间数组两次定义了密钥“ day”,因此该数组将无效。

尝试将输入数组更改为

$times = array(
    'Monday',
    'Sunday
);

第二,array_search()不能接受数组作为其第一个值,因为它期望搜索项,请参见:

http://php.net/manual/en/function.array-search.php

当数组搜索返回找到的值的数组的Key时,这不是您需要的,您可以使用:

http://php.net/manual/en/function.array-count-values.php

这将在您的输入数组中获取一个唯一的值列表,并返回键=>设置为value => count的值作为新数组。

$times = array('Monday','Tuesday','Wednesday','Monday','Monday');
print_r(array_count_values($times));

应返回:

array (
    [Monday] => 3
    [Tuesday] => 1
    [Wednesday] => 1
)

更新:

op提供多维数组后,解决方案将是

array_count_values(array_column($array, $key));

答案 1 :(得分:0)

您可以使用;

print_r(array_count_values($times));

答案 2 :(得分:0)

一个问题是array_search的针头是明确的,与strpos不同。因此,假设可能希望搜索SundayEvery Sunday,则One Sunday将与Every Sunday的值不匹配。

由于您已经知道要搜索的关键字,因此建议您将array_filterstrpos结合使用。然后,您可以简单地使用count($filteredTimes)确定数量,或使用array_keys($filteredTimes)来检索密钥,就像array_search;

这等效于使用array_columnarray_searcharray_count_valuesarray_keys($array, $search)。 但是,它不仅会返回包含2个迭代的键(或单个键)数组,还将返回包含所需条件或为空的原始数组值(包含1个迭代)。

示例:https://3v4l.org/uCUMr

$filteredTimes = array_filter($times, function($v) {
    return isset($v['day']) && (false !== strpos($v['day'], 'Sunday') || false !== strpos($v['day'], 'Monday'));
});
$matchingDays = count($filteredTimes);

var_export($filteredTimes);
var_dump($matchingDays);

结果

array (
  0 => 
  array (
    'day' => 'Every Sunday',
    'time' => '08:00',
    'form' => 'normal',
  ),
  1 => 
  array (
    'day' => 'Every Monday',
    'time' => '10:30',
    'form' => 'special',
  ),
)

int(2)