将数组值解析为多维数组

时间:2014-06-04 23:50:03

标签: 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
        [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
            )

    )

 )

2 个答案:

答案 0 :(得分:1)

如果您需要这样的结构,则需要创建它的新副本。您可能还需要首先使用array_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',
    'Magic Johnson Theater',
    '2014-06-04T19:10',
    '2014-06-04T19:10',
    '2014-06-04T19:10',
    'Mall of America Theater',
    '2014-06-04T19:10',
    '2014-06-04T19:10',
    '2014-06-04T19:10',
    '2014-06-04T19:10',
);

$new_values = array();
$current_key = 0;
foreach($old_values as $key => $value) {
    $current_value = $value;
    $pieces = explode('T', $current_value);
    $dates = explode('-', $pieces[0]);
    if(count($dates) == 3) {
        $new_values[$current_key]['showtimes'][] = $current_value;
    } else {
        $current_key++;
        $new_values[$current_key]['theater']['name'] = $current_value;
    }
}

示例输出:

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
                )

        )

)

Sample Fiddle

答案 1 :(得分:1)

我假设您正在尝试访问某些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++;
    }

}

Outcome

为了引导您完成,$array是返回的数据集。我们在$i值中设置了一个索引,并且如果我们确定我们已经检测到影院名称,则只想增加它。在循环中我们首先尝试确定字符串是否可以转换为php时间值。如果它不能我们将剧院名称添加到我们的新架构结构中,并增加我们的索引值。由于时间总是被添加到剧院名称中,我们期望第一个索引号始终比我们想要添加showtime的值高一个。

如果在Next Month等情况下剧院名称可转换为时间值,则无法准确。还有其他两种方法可以通过正则表达式或通过检查字符串中的某些字符及其位置来解决这个问题,因为时间格式将保持不变。

您可以将strtotime()替换为:

$str = str_split($value);
if (($str[4] && $str[7]) == '-' && $str[10] == 'T' && $str[13] == ':' ) {
    $theaters[$i - 1]['showtimes'][] = $value;
}