我有一个多维数组,看起来像这样:
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循环遍历所有内容吗?
答案 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
不同。因此,假设可能希望搜索Sunday
或Every Sunday
,则One Sunday
将与Every Sunday
的值不匹配。
由于您已经知道要搜索的关键字,因此建议您将array_filter
与strpos
结合使用。然后,您可以简单地使用count($filteredTimes)
确定数量,或使用array_keys($filteredTimes)
来检索密钥,就像array_search
;
这等效于使用array_column
和array_search
或array_count_values
或array_keys($array, $search)
。
但是,它不仅会返回包含2个迭代的键(或单个键)数组,还将返回包含所需条件或为空的原始数组值(包含1个迭代)。
$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)