Php 如果键不存在,则创建数组';t exist,如果键已存在,则将值推送到同一个键

Php 如果键不存在,则创建数组';t exist,如果键已存在,则将值推送到同一个键,php,arrays,Php,Arrays,我有一个API抛出的这个对象,我想将它重新创建到一个新数组中,并组合具有相同日期值的每个元素的时间值 Array ( [0] => Array ( [id] => 6 [time] => morning [date] => 2015-09-29 ) [1] => Array ( [id] => 5 [time

我有一个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代码,但它不能正常工作,具有相同日期的第二个元素不会在现有键上添加时间值,我不知道如何正确设置
$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']  ),
    ); 
}
我真正想要的结果是这样的

array(
        [2015-09-29] => array(
            [date] => 2015-09-29
            [fully_book] => true,
            [time] => array(
                  [0] => morning,
                  [1] => night
            )
        ),
        [2015-12-07] = array(
            [date] => 2015-09-29,
            [fully_book] => false,
            [time] => array(
                  [0] => night
            )
        ),
        [2015-11-15] = array(
            [date] => 2015-11-15,
            [fully_book] => false,
            [time] => array(
                  [0] => morning
            )
    )
非常感谢您的帮助

谢谢创建一个空数组 循环数组 将空数组键设置为如下所示的日期 空数组[val[date]]=数组('date'=>val[date],…)

创建一个空数组 循环数组 将空数组键设置为如下所示的日期
空数组[val[date]]=数组('date'=>val[date],…)

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

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

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

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

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.
重复条目将覆盖上一个条目,但这没关系,因为这些字段是相同的。任何时候处理新的
数据['time']
时,都会添加该数据

$full
现在统计添加
$data['time']
$data['time']
中的元素数,并在提供的时间超过1次后添加true

上述结果如下:

array(3) {
  ["2015-09-29"]=>
  array(3) {
    ["date"]=>
    string(10) "2015-09-29"
    ["time"]=>
    array(2) {
      [0]=>
      string(7) "morning"
      [1]=>
      string(5) "night"
    }
    ["fully_book"]=>
    bool(true)
  }
  ["2015-12-07"]=>
  array(3) {
    ["date"]=>
    string(10) "2015-12-07"
    ["time"]=>
    array(1) {
      [0]=>
      string(7) "morning"
    }
    ["fully_book"]=>
    bool(false)
  }
  ["2015-11-15"]=>
  array(3) {
    ["date"]=>
    string(10) "2015-11-15"
    ["time"]=>
    array(1) {
      [0]=>
      string(5) "night"
    }
    ["fully_book"]=>
    bool(false)
  }
}

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.
重复条目将覆盖上一个条目,但这没关系,因为这些字段是相同的。任何时候处理新的
数据['time']
时,都会添加该数据

$full
现在统计添加
$data['time']
$data['time']
中的元素数,并在提供的时间超过1次后添加true

上述结果如下:

array(3) {
  ["2015-09-29"]=>
  array(3) {
    ["date"]=>
    string(10) "2015-09-29"
    ["time"]=>
    array(2) {
      [0]=>
      string(7) "morning"
      [1]=>
      string(5) "night"
    }
    ["fully_book"]=>
    bool(true)
  }
  ["2015-12-07"]=>
  array(3) {
    ["date"]=>
    string(10) "2015-12-07"
    ["time"]=>
    array(1) {
      [0]=>
      string(7) "morning"
    }
    ["fully_book"]=>
    bool(false)
  }
  ["2015-11-15"]=>
  array(3) {
    ["date"]=>
    string(10) "2015-11-15"
    ["time"]=>
    array(1) {
      [0]=>
      string(5) "night"
    }
    ["fully_book"]=>
    bool(false)
  }
}
一种
O(n)
解决方案 我认为,如果我们做某种排序,这个“可能”会更快(但它会创建一个准线性),但无法找到任何方法使它更快。没关系,最快的是
O(n)
,因为我们需要插入所有键和值。我让代码变得更复杂了(因为您给我们的可能并不总是相同的输入(例如,
时间
可能并不总是像
早/晚
那样简单)

<?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'
        )
);
这将输出一个创建得很好的数组,其中日期作为键,所有重复项以及您在回答中指定的数组输出中的其他相关信息。您可以更改内容(因为
foreach
循环非常灵活),以防需要其他类型的数据输入

太长了,读不下去了,满代码: 你可以在电脑上测试


a
O(n)
解决方案 我认为如果我们进行某种排序(但它会创建一个准线性),这个“可能”会更快,但无法找到任何方法使它更快。没关系,最快的是
O(n)
,因为我们无论如何都需要插入所有键和值。我让代码更复杂一些(因为您给我们的输入不一定总是相同的(例如,
时间
可能并不总是像
早/晚
那样简单)。首先,对语法进行一些重新格式化,以获得由PHP创建的数组

<?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'
        )
);
这将输出一个创建得很好的数组,其中日期作为键,所有重复项以及您在回答中指定的数组输出中的其他相关信息。您可以更改内容(因为
foreach
循环非常灵活),以防需要其他类型的数据输入

太长了,读不下去了,满代码: 你可以在电脑上测试




因为您使用日期作为键,并且数组中不能有重复的键刚刚编辑了我的问题,我知道,如果日期相同,我想在循环中组合时间值检查键是否存在,如果存在,则添加,否则创建新我实际尝试过使用
$newdata=array('time'=>$data['time']);如果(array_key_exists($data['date'],$date)){array_push($data['date'],$newdata);}
但它只是搞砸了,我甚至不知道数组键是否存在,数组键是否是一个选项将
时间
值始终是
早上
/
晚上
,并且每个日期只有一个?因为你使用日期作为键,并且数组中不能有重复的键刚刚编辑了我的问题,我知道这一点,并且想将它们结合起来me value if date是循环中的同一项检查键是否存在,如果是,则添加,否则创建新我实际尝试了
$newdata=array('time'=>$data['time'],);如果(array_key_存在($data['date'],$date)){array_push($data['date'],$newdata);}
但它只是搞砸了,我甚至不知道数组键是否存在,数组推送是否是一个选项将
time
值始终是
早上
/
晚上
,并且每个日期只有一个?您的代码不工作。看看第一个数组,它仍然是
[“fully\u book”]=>bool(false)
即使
[“time”=>数组(2)…
。你的
$full=count($data['time'])>1?真:假;
没有做你认为应该做的事。@Sean,这是OP提供的,我假设(显然是错误的)它是按预期工作的,因为问题似乎集中在增加
时间
。我再看一看。这是OP最初问题的一部分“…我不知道如何正确设置
$full
变量”@Sean,Yikes!你完全正确。我已经更新了我的答案,以反映
$full
正在设置(以及设置
'$date['fully_book']
正确。谢谢你,你的想法很好用,API实际上抛出了不同的数据,但我现在让它工作了,再次感谢你的代码没有