Php 如果键不存在,则创建数组';t exist,如果键已存在,则将值推送到同一个键
我有一个API抛出的这个对象,我想将它重新创建到一个新数组中,并组合具有相同日期值的每个元素的时间值Php 如果键不存在,则创建数组';t exist,如果键已存在,则将值推送到同一个键,php,arrays,Php,Arrays,我有一个API抛出的这个对象,我想将它重新创建到一个新数组中,并组合具有相同日期值的每个元素的时间值 Array ( [0] => Array ( [id] => 6 [time] => morning [date] => 2015-09-29 ) [1] => Array ( [id] => 5 [time
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
循环非常灵活),以防需要其他类型的数据输入
太长了,读不下去了,满代码:
你可以在电脑上测试
aO(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实际上抛出了不同的数据,但我现在让它工作了,再次感谢你的代码没有