Php 将数组值解析为多维数组
我从JSON提要中检索到一些数据,这些数据目前正在解析为如下数组:(为了演示而简化) 因此,几乎一个数组返回一个电影院名称,以及与该特定电影院相关的放映时间Php 将数组值解析为多维数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我从JSON提要中检索到一些数据,这些数据目前正在解析为如下数组:(为了演示而简化) 因此,几乎一个数组返回一个电影院名称,以及与该特定电影院相关的放映时间 [0] => American Theater [1] => 2014-06-04T13:10 [2] => 2014-06-04T15:10 [3] => Grand Theater [4] => 2014-06-04T15:30
[0] => American Theater
[1] => 2014-06-04T13:10
[2] => 2014-06-04T15:10
[3] => Grand Theater
[4] => 2014-06-04T15:30
[5] => 2014-06-04T19:10
如何将此数组解析为多维数组,例如:
Array
(
[0] => Array
(
[theater] => Array
(
[name] => American Theater
)
[showtimes] => Array
(
[1] => 2014-06-04T13:10
[2] => 2014-06-04T15:10
)
)
[1] => Array
(
[theater] => Array
(
[name] => Grand Theater
)
[showtimes] => Array
(
[1] => 2014-06-04T15:30
[2] => 2014-06-04T19:10
)
)
)
如果需要这种结构,则需要创建它的新副本。您可能还需要先使用
array\u chunk
将它们按三个进行分块/分组,然后,您可以从那里开始循环,并开始创建所需的格式
考虑这个例子:
$old_values = array('American Theater', '2014-06-04T13:10', '2014-06-04T15:10', 'Grand Theater', '2014-06-04T15:30', '2014-06-04T19:10');
$old_values = array_chunk($old_values, 3);
$new_values = array();
foreach($old_values as $key => $value) {
$new_values[] = array(
'theater' => array('name' => $value[0]),
'showtimes' => array(1 => $value[1], 2 => $value[2]),
);
}
编辑:如前所述,一个剧院可以有多个放映时间,因此当前的解决方案将失败。这可能是另一种选择(您可能需要检查每个元素是否为剧院名称或日期)。考虑这个例子:
$old_values = array('American Theater', '2014-06-04T13:10', '2014-06-04T15:10', 'Grand Theater', '2014-06-04T15:30', '2014-06-04T19:10');
$old_values = array_chunk($old_values, 3);
$new_values = array();
foreach($old_values as $key => $value) {
$new_values[] = array(
'theater' => array('name' => $value[0]),
'showtimes' => array(1 => $value[1], 2 => $value[2]),
);
}
样本输出:
Array
(
[1] => Array
(
[theater] => Array
(
[name] => American Theater
)
[showtimes] => Array
(
[0] => 2014-06-04T13:10
[1] => 2014-06-04T15:10
)
)
[2] => Array
(
[theater] => Array
(
[name] => Grand Theater
)
[showtimes] => Array
(
[0] => 2014-06-04T15:30
[1] => 2014-06-04T19:10
)
)
[3] => Array
(
[theater] => Array
(
[name] => Magic Johnson Theater
)
[showtimes] => Array
(
[0] => 2014-06-04T19:10
[1] => 2014-06-04T19:10
[2] => 2014-06-04T19:10
)
)
[4] => Array
(
[theater] => Array
(
[name] => Mall of America Theater
)
[showtimes] => Array
(
[0] => 2014-06-04T19:10
[1] => 2014-06-04T19:10
[2] => 2014-06-04T19:10
[3] => 2014-06-04T19:10
)
)
)
我假设您试图访问某个api,但无法控制数据如何传回给您?如果您这样做,那么API应该负责返回一个合理的模式 但是,如果您被迫使用此阵列,并且您不知道显示时间的数量,那么您可以执行以下操作:
$array = array(
'American Theater',
'2014-06-04T13:10',
'2014-06-04T15:10',
'Grand Theater',
'2014-06-04T15:30',
'2014-06-04T19:10'
);
$i = 0;
foreach ($array as $key => $value) {
if (strtotime($value)) {
$theaters[$i - 1]['showtimes'][] = $value;
}
else {
$theaters[$i]['theater']['name'] = $value;
$i++;
}
}
为了让您了解它,$array
是返回的数据集。我们在$i
值中设置了一个索引,并且只想在确定检测到剧院名称时增加它。在循环中,我们首先尝试确定字符串是否可以转换为php时间值。如果不能,我们将剧院名称添加到新的模式结构中,并增加索引值。由于时间总是添加到剧院名称中,我们希望第一个索引编号总是比我们想要添加showtime的编号高一个
在剧院名称可转换为时间值的情况下(如下个月
),这将不准确。使用正则表达式或检查字符串中的某些字符及其位置,还有其他几种方法可以解决这个问题,因为时间格式将保持不变
您可以将strtotime()替换为:
$str = str_split($value);
if (($str[4] && $str[7]) == '-' && $str[10] == 'T' && $str[13] == ':' ) {
$theaters[$i - 1]['showtimes'][] = $value;
}
不幸的是,这对我来说是行不通的,因为有些剧院比其他剧院返回的次数多。因此,将其分为多个部分将是非常困难的inaccurate@tcornell05好吧,你应该在问题中加上这一点:)这样我就可以对此事负责了,我向你道歉!谢谢。@tcornell05顺便问一下,由于每个数组元素都没有标记,如何检查该元素中的值是否确实是“剧院名称”?你有什么清单吗?或者你只需要检查这个特定的元素是否是一个专有名词?因为有些元素是时间。@tcornell05如果是这种情况,您可以检查编辑