【问题标题】:Turn string into multi-dimensional array equivalent将字符串转换为等效的多维数组
【发布时间】:2019-03-07 13:49:56
【问题描述】:

我正在尝试从 URL 解析字符串并将其转换为 PHP 数组,但到目前为止我还无法让它正常工作。 该字符串包含逗号分隔的值,然后按句点分组,例如:

course.id,course.title,course.author,course.duration,course.trailer.video_key,course.trailer.duration,course.lessons.id,course.lessons.title,track.id,track.title,track.caption.srt,track.caption.vtt,track.caption.text

等价于这个字符串的数组是:

PHP:

$array = [
    'course' => [
        'id',
        'title',
        'author',
        'duration',
        'trailer' => [
            'video_key',
            'duration'
        ],
        'lessons' => [
            'id',
            'title'
        ]
    ],
    'track' => [
        'id',
        'title',
        'caption' => [
            'srt',
            'vtt',
            'text'
        ]
    ]
];

我目前的解决方案是这样的:

PHP:

$string = 'course.id,course.title,course.author,course.duration,course.trailer.video_key,course.trailer.duration,course.lessons.id,course.lessons.title,track.id,track.title,track.caption.srt,track.caption.vtt,track.caption.text';
$parameters = explode( ',', $string );

$array = array();
$inset = array();

foreach ( $parameters as $parameter ) {

    $segments = explode( '.', $parameter );

    if ( ! array_key_exists( $segments[0], $inset ) ) {
        $array[ $segments[0] ] = array();
        $inset[ $segments[0] ] = true;
    }

    $array[ $segments[0] ] = array_merge( $array[ $segments[0] ], addSegment( $segments, 1 ) );

}

function addSegment( $segments, $counter ) {

    $results = array();

    if ( end( $segments ) == $segments[ $counter ] ) {
        return array( $segments[ $counter ] => null );
    }

    $results[ $segments[ $counter ] ] = addSegment( $segments, $counter + 1 );

    return $results;

}

不过,这有点奏效;它失败了,像这样更简单的字符串 course,track,lessons

我认为这需要递归,但我不擅长写这个,所以我希望有人已经这样做并且可以帮助我。

谢谢。

【问题讨论】:

    标签: php arrays recursion


    【解决方案1】:

    您无需递归即可实现此目的 - 只需双循环并使用 &:

    $arr = explode(",", "course.id,course.title,course.author,course.duration,course.trailer.video_key,course.trailer.duration,course.lessons.id,course.lessons.title,track.id,track.title,track.caption.srt,track.caption.vtt,track.caption.text");
    foreach($arr as $e) {
        $e = explode(".", $e);
        $obj = &$res; //set the current place root
        while(count($e) > 1) { // last element will be add as value
            $key = array_shift($e);
            if (!isset($obj[$key]))
                $obj[$key] = [];
            $obj = &$obj[$key]; //reset the current place
        }
        $obj[] = array_shift($e); // add the last as value to current place
    }
    

    $res 将包含你想要的输出

    【讨论】:

    • 你好@dWinder,谢谢你的解决方案,它很接近但数组不是我需要的格式。它正在返回这个gist.github.com/yojance/ad2ba51b1714bbb93eda4ce31e2ffbf5
    • @Yojance 有什么不同?我看到的唯一不同是数组中没有键的所有元素的整数键,所以我将整数指定为默认键 - 预期的行为是什么?
    • 我还复制了您的$array 并检查了echo ($res === $array); 哪个输出为TRUE
    • 我想我可以结合使用 array_key_exists() 或 in_array 来检查当前解决方案的值。
    • 当然可以。此外,我的主张是您需要将它用于任何解决方案,因为您期望的输出和我的相同
    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 2012-11-17
    相关资源
    最近更新 更多