Php 将数组值解析为多维数组

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

我从JSON提要中检索到一些数据,这些数据目前正在解析为如下数组:(为了演示而简化)

因此,几乎一个数组返回一个电影院名称,以及与该特定电影院相关的放映时间

        [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如果是这种情况,您可以检查编辑