在添加之前检查php多维数组中是否存在值

时间:2015-04-23 21:37:09

标签: php arrays multidimensional-array key multiple-value

我有一套独立的功能可以抓住"日期"和"时间"从我的应用程序中,将日期作为一个键,将时间作为一个多维值。

例如:

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

3 个答案:

答案 0 :(得分:1)

您可以在循环结果之前在每个子阵列上添加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 :(得分:0)

您可以编写递归函数

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

答案 2 :(得分: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>';
}