Thursday, 30 August 2018

Converting string to multidimensional array in PHP

I have this as a string input.

$str = '[2]Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vulputate cursus nulla, at rhoncus ante egestas vitae. [3]Cras euismod aliquet hendrerit. [3]Integer tortor lorem, suscipit a ante id, faucibus iaculis dolor. Sed aliquet, erat sit amet porta efficitur, eros lorem hendrerit purus, eget pellentesque lacus sapien ut dolor. [3]Donec eget accumsan velit. [4]Vestibulum consectetur enim in nunc fermentum lacinia. Maecenas fermentum rutrum sodales. Quisque vulputate, dolor tempus luctus cursus, massa urna ultrices odio, non dictum sem nulla ac mi. Quisque egestas tellus velit, non elementum lorem consequat id. Proin bibendum feugiat mollis. Sed vel odio neque. [4]Tempo. [2]Phasellus ut mauris purus. Quisque vel tortor erat. [2]Donec eget accumsan velit.';

And I'm trying to get to this...
array (
[0] => array ( //First [2] and everything below
    [0] => Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vulputate cursus nulla, at rhoncus ante egestas vitae.
    [1] => array ( //[3]s that belong to first [2]
        [0] => Cras euismod aliquet hendrerit. //First [3]
        [1] => Integer tortor lorem, suscipit a ante id, faucibus iaculis dolor. Sed aliquet, erat sit amet porta efficitur, eros lorem hendrerit purus, eget pellentesque lacus sapien ut dolor. //Second [3]
        [2] => array ( //Third [3] and everything below
            [0] => Donec eget accumsan velit.
            [1] => array (
                [0] => Vestibulum consectetur enim in nunc fermentum lacinia. Maecenas fermentum rutrum sodales. Quisque vulputate, dolor tempus luctus cursus, massa urna ultrices odio, non dictum sem nulla ac mi. Quisque egestas tellus velit, non elementum lorem consequat id. Proin bibendum feugiat mollis. Sed vel odio neque.
                [1] => Tempo.
                )
            )
        )
[1] => Phasellus ut mauris purus. Quisque vel tortor erat. //Second [2]
[2] => Donec eget accumsan velit. //Third [2]

)
I've tried everything I knew and could find @php.net and everywhere else, but I've spent about six hours on this and I'm still stuck. I've tried explode, preg_replace, array_walk_recursive (along with explode), going from the biggest hierarchy to smaller (best results so far) and the other way around, but nothing. How can I convert a string to a multidimensional array in PHP, setting the hierarchy by tags in the string?
Many thanks!

This code
$str = '<your_string>';

function stringToArray($str, $delimiter = 2, $isFirst = false) {
    $delimiterStr = "[{$delimiter}]";
    $outArr = array();
    if (strpos($str,$delimiterStr)!==false) {
        $outArr = explode($delimiterStr, $str);
        $isFirstElement = true;
        $tempArr = array();
        $key = 0;
        foreach ($outArr AS $v) {

            if (!empty($v))
            {
                if ($isFirstElement) {
                    $tempArr[$key] = stringToArray($v, $delimiter+1);
                    $key++;
                } else {
                    $tempArr[$key][] = stringToArray($v, $delimiter+1);
                }
            }
            $isFirstElement = false;
        }
        $outArr = $tempArr;
    }
    if (!$outArr) {return trim($str);} else {return $outArr;}
}

$elements = stringToArray($str);
print_r($elements[0]);

will return
Array
(
[0] => Array
    (
        [0] => Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vulputate cursus nulla, at rhoncus ante egestas vitae.
        [1] => Array
            (
                [0] => Cras euismod aliquet hendrerit.
                [1] => Integer tortor lorem, suscipit a ante id, faucibus iaculis dolor. Sed aliquet, erat sit amet porta efficitur, eros lorem hendrerit purus, eget pellentesque lacus sapien ut dolor.
                [2] => Array
                    (
                        [0] => Donec eget accumsan velit.
                        [1] => Array
                            (
                                [0] => Vestibulum consectetur enim in nunc fermentum lacinia. Maecenas fermentum rutrum sodales. Quisque vulputate, dolor tempus luctus cursus, massa urna ultrices odio, non dictum sem nulla ac mi. Quisque egestas tellus velit, non elementum lorem consequat id. Proin bibendum feugiat mollis. Sed vel odio neque.
                                [1] => Tempo.
                            )

                    )

            )

    )

[1] => Phasellus ut mauris purus. Quisque vel tortor erat.
[2] => Donec eget accumsan velit.
)

0 comments:

Post a Comment