pCreate数组如果key不存在则将值推送到同一个键(如果key已存在)

时间:2015-09-08 20:43:11

标签: php arrays

我有一个API抛出这个对象,我想将它重新创建为一个新数组并组合具有相同日期值的每个元素的时间值

Array (
    [0] => Array (
            [id] => 6
            [time] => morning
            [date] => 2015-09-29
        )

    [1] => Array (
            [id] => 5
            [time] => night
            [date] => 2015-09-29 
        )
    [2] => Array 
            [id] => 31
            [time] => morning
            [date] => 2015-12-07 
        )

    [3] => Array
            [id] => 3
            [time] => night
            [date] => 2015-11-15
        )

)

我有这个PHP代码,但它无法正常工作,具有相同日期的第二个元素不会在现有密钥上添加时间值,我不确定如何正确设置{{1}变量

$full

我真正想要得到的结果是这样的,

$date = array();
foreach( $datas as $data) { 

    $full = count(  $data['time'] ) > 1 ? true : false;
    $dates[$data['date']] = array(
        'date' => $data['date'],
        'fully_book' => $full,    
        'time' => array( $data['time']  ),
    ); 
}

非常感谢任何帮助,

由于

4 个答案:

答案 0 :(得分:2)

这应该更简单。这样你唯一需要检查的就是次数。

foreach( $datas as $data) {
    //set the date (overwrites each time for repeated dates)
    $date[$data['date']]['date'] = $data['date'];
    $date[$data['date']]['time'][] = $data['time'];  //add the time
    // after the time has been added you can check the number of times
    $date[$data['date']]['fully_book'] = count($date[$data['date']]['time']) > 1;
}

答案 1 :(得分:2)

stdout循环中增加时间索引:

foreach

重复的条目将覆盖前一个条目,但这样做是正确的,因为这些字段是相同的。每当处理新的$date = array(); foreach($datas as $data) { $date[$data['date']]['date'] = $data['date']; //I'm not entirely sure why you need this. You might consider just relying on the key. $date[$data['date']]['time'][] = $data['time']; $full = count($date[$data['date']]['time']) > 1 ? true : false; $date[$data['date']]['fully_book'] = $full; } var_dump($date); //see below. 时,都会添加它。

data['time']现在计算添加$full$data['time']中的元素数量,一旦提供的时间超过1次,就会添加为真。

以上输出如下:

$data['time']

答案 2 :(得分:0)

创建一个空数组 循环数组 像这样设置空数组键到日期 empty_array [val [date]] = array(' date' => val [date],..)

答案 3 :(得分:0)

O(n)解决方案

我认为这"可以"如果我们做某种sort(然后它会创建一个准线性),会更快,但无法找到任何方法使它更快。没关系,最快的是{ {1}},因为我们需要插入所有键和值。我使代码更复杂一些(因为你给我们的东西可能不一定总是相同的输入(例如O(n)可能并不总是像time那么简单)。首先,一些语法重新格式化以获取PHP创建的数组

morning/night

迭代数组以查找重复项

现在构造了数组,我们将遍历整个数组。由于日期作为键存储在输出数组中,并且我们知道必须将所有可能的日期作为键,我们可以尝试为每次迭代存储一个键,如果已存在,则表示已经有一些&# 34;日期"日期槽中的值。通常我们不需要检查它是早上还是晚上,因为有一些日期设置(并且基于你给我们的阵列),唯一的可能是当前是当一个是夜晚或反之亦然,但为了简洁起见,我们将检查:

<?php
$array = array(
    0 => array(
            'id' => 6,
            'time' => 'morning',
            'date' => '2015-09-29'
        ),
    1 => array(
            'id' => 5,
            'time' => 'night',
            'date' => '2015-09-29'
        ),
    2 => array(
            'id' => 31,
            'time' => 'morning',
            'date' => '2015-12-07'
        ),
    3 => array(
            'id' => 3,
            'time' => 'night',
            'date' => '2015-11-15'
        )
);

这将输出一个创建良好的数组,其中日期为键,以及您在答案中指定的数组输出中的所有重复项和其他相关信息。如果您需要其他类型的数据输入,您可以更改(因为$output = array(); foreach ($array as $val) { if (!isset($output[$val['date']])) { $output[$val['date']] = array( 'date' => $val['date'], 'fully_book' => false, //By default since the key never existed 'time' => array( $val['time'] ) ); } else { if ($output[$val['date']]['time'][0] != $val['time']) { //A single mismatch means that this date must be fully booked since there is only morning or night $output[$val['time']][] = $val['time']; $output[$val['date']]['fully_booked'] = true; } } } print_r($output); //Outputs: Array ( [2015-09-29] => Array ( [date] => 2015-09-29 [fully_book] => [time] => Array ( [0] => morning ) [fully_booked] => 1 ) [night] => Array ( [0] => night ) [2015-12-07] => Array ( [date] => 2015-12-07 [fully_book] => [time] => Array ( [0] => morning ) ) [2015-11-15] => Array ( [date] => 2015-11-15 [fully_book] => [time] => Array ( [0] => night ) ) ) 循环非常灵活)。

tl; dr和完整代码:

您可以在PHPFiddle

上对此进行测试
foreach