添加前检查 php 多维数组中是否存在值
Check if value exists in php multi-dimensional array before adding
我有一组单独的函数,可以从我的应用程序中获取 "Date" 和 "Time",并将日期作为键,将时间作为多维值。
举例说明:
$alldatetimes = array(
'date1' => array('13:00','14:30','14:30','14:30','15:00'),
'date2' => array('09:00','10:00','10:30','10:30','12:00')
);
foreach ($alldatetimes as $date => $times) {
echo '<h1>This Exports:</h1>';
echo '<h2>'.$date.'</h2><br>';
foreach ($times as $time) {
echo $time.'<br>';
}
}
This exports:
date1
13:00
14:30
14:30
14:30
15:00
date2
09:00
10:00
10:30
10:30
12:00
我正在尝试控制是否将时间放入数组中,因此数组中每个值只有一个值(我不希望那个日期有 3 个 14:30 实例)。
根据此处的其他帖子,我尝试构建类似这样的东西来确定值是否存在,但我不知道如何将它们联系在一起:
function searchForId($id, $array) {
foreach ($array as $date => $times) {
foreach ($times as $time) {
if ($time === $id) {
return $time;
}
}
}
return null;
}
有什么想法吗?
更新:这是最初创建数组的方式 - 这可能更有效:
while ($schedule_q -> have_posts() ) : $schedule_q->the_post();
$alldatetimes [get_the_date()][] = get_the_time();
endwhile;
你可以写一个递归函数
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
您可以在遍历结果之前对每个子数组添加一个 array_unique()
调用,以确保它们都是唯一的:
foreach ($alldatetimes as &$row) {
$row = array_unique($row);
}
输出:
<h1>This Exports:</h1>
<h2>date1</h2><br>
13:00<br>
14:30<br>
15:00<br>
<h1>This Exports:</h1>
<h2>date2</h2><br>
09:00<br>
10:00<br>
10:30<br>
12:00<br>
你的问题中没有显示,但是如何修改构建 date/time 数组的函数以使用时间作为键而不是值?使用像
这样的东西
$alldatetimes[$date][$time]++
在那个函数中会给你一个数组,每次都有一个值,就是 date/time 组合出现的次数,就像这样:
$alldatetimes = array(
'date1' => array('13:00' => 1,'14:30' => 3,'15:00' => 1),
'date2' => array('09:00' => 1,'10:00' => 1,'10:30' => 2,'12:00' => 1)
);
然后您可以更改打印它们的代码以使用密钥。
foreach ($times as $time => $count) {
echo $time.'<br>';
}
我有一组单独的函数,可以从我的应用程序中获取 "Date" 和 "Time",并将日期作为键,将时间作为多维值。
举例说明:
$alldatetimes = array(
'date1' => array('13:00','14:30','14:30','14:30','15:00'),
'date2' => array('09:00','10:00','10:30','10:30','12:00')
);
foreach ($alldatetimes as $date => $times) {
echo '<h1>This Exports:</h1>';
echo '<h2>'.$date.'</h2><br>';
foreach ($times as $time) {
echo $time.'<br>';
}
}
This exports:
date1
13:00
14:30
14:30
14:30
15:00
date2
09:00
10:00
10:30
10:30
12:00
我正在尝试控制是否将时间放入数组中,因此数组中每个值只有一个值(我不希望那个日期有 3 个 14:30 实例)。
根据此处的其他帖子,我尝试构建类似这样的东西来确定值是否存在,但我不知道如何将它们联系在一起:
function searchForId($id, $array) {
foreach ($array as $date => $times) {
foreach ($times as $time) {
if ($time === $id) {
return $time;
}
}
}
return null;
}
有什么想法吗?
更新:这是最初创建数组的方式 - 这可能更有效:
while ($schedule_q -> have_posts() ) : $schedule_q->the_post();
$alldatetimes [get_the_date()][] = get_the_time();
endwhile;
你可以写一个递归函数
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
您可以在遍历结果之前对每个子数组添加一个 array_unique()
调用,以确保它们都是唯一的:
foreach ($alldatetimes as &$row) {
$row = array_unique($row);
}
输出:
<h1>This Exports:</h1>
<h2>date1</h2><br>
13:00<br>
14:30<br>
15:00<br>
<h1>This Exports:</h1>
<h2>date2</h2><br>
09:00<br>
10:00<br>
10:30<br>
12:00<br>
你的问题中没有显示,但是如何修改构建 date/time 数组的函数以使用时间作为键而不是值?使用像
这样的东西$alldatetimes[$date][$time]++
在那个函数中会给你一个数组,每次都有一个值,就是 date/time 组合出现的次数,就像这样:
$alldatetimes = array(
'date1' => array('13:00' => 1,'14:30' => 3,'15:00' => 1),
'date2' => array('09:00' => 1,'10:00' => 1,'10:30' => 2,'12:00' => 1)
);
然后您可以更改打印它们的代码以使用密钥。
foreach ($times as $time => $count) {
echo $time.'<br>';
}