Проверьте, существует ли значение в многомерном массиве php перед добавлением

У меня есть отдельный набор функций, которые извлекают «Дата» и «Время» из моего приложения и помещают дату в качестве ключа, а время в качестве многомерного значения.

Для примера:

$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;

0

Решение

Это не показано в вашем вопросе, но как насчет изменения вашей функции, которая создает массив даты / времени, чтобы использовать время в качестве ключей вместо значений? Используя что-то вроде

$alldatetimes[$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>';
}
0

Другие решения

Вы можете добавить 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>
1

Вы можете написать рекурсивную функцию

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;
}
0
По вопросам рекламы [email protected]