This is my first question, i have been able to solve many issues by using your forum, but I am coming for your help because i do not know how to solve my issue. I hope i will be understandable.
I want to convert a string to an array of array, but all my readings dit not help me to find a solution.
I have a string in this format
$string = "records[0].CardName=TEST records[0].CardNo=01234567 records[0].CreateTime=1566835406 records[0].Door=0 records[0].Method=1 records[0].Password= records[0].RecNo=1366 records[0].Status=1 records[0].URL= records[0].UserID=9901 records[1].CardName=TEST records[1].CardNo=01234567 records[1].CreateTime=1566851904 records[1].Door=0 records[1].Method=1 records[1].Password= records[1].RecNo=1368 records[1].Status=1 records[1].URL= records[1].UserID=9901";
So you can see that this is always the same structure and only values are modified, there is more than 2 repetition of this element, but to keep it readable i just put two of them. I want to have an array created when the records[X] changes and then put each element matching records[X] into this array.
I want to convert it as an array which would look like this.
Array ( [0] => Array ( [CardName] =>TEST [CardNo] => 01234567 [CreateTime] => 1566835406 [Door] => 0 [Method] => 1 [Password] => [RecNo] => 1366 [Status] => 1 ) [1] => Array ( [CardName] => TEST [CardNo] => 01234567 [CreateTime] => 1566835406 [Door] => 0 [Method] => 1 [Password] => [RecNo] => 1366 [Status] => 1 ) )
The goal is to access the last element of the array and to be precise the value CreateTime like this : end($array)[‘CreateTime’].
What I have try does not help me and i am stuck with no idea on how to deal with that issue.
$array = preg_split('/s+/',$string); if(is_array($array) { print_r($array); } // Gives me this : Array ( [0] => records[0].CardName=TEST [1] => records[0].CardNo=01234567 [2] => records[0].CreateTime=1566835406 [3] => records[0].Door=0 [4] => records[0].Method=1 [5] => records[0].Password= [6] => records[0].RecNo=1366 [7] => records[0].Status=1 [8] => records[1].CardName=TEST [9] => records[1].CardNo=01234567 [10] => records[1].CreateTime=1566835508 [11] => records[2].Door=0 [12] => records[3].Method=1 [13] => records[4].Password= [14] => records[5].RecNo=1366 [15] => records[6].Status=1 ) I have also tried something like that with multiple different delimiter with no success function multiexplode ($delimiters,$string) { $ary = explode($delimiters[0],$string); array_shift($delimiters); if($delimiters != NULL) { foreach($ary as $key => $val) { $ary[$key] = multiexplode($delimiters, $val); } } return $ary; } // Example of use $string = "records[0].CardName=APKO records[0].CardNo=88043527 records[0].CreateTime=1566835406 records[0].Door=0 records[0].Method=1 records[0].Password= records[0].RecNo=1366 records[0].Status=1 records[0].URL= records[0].UserID=9901 records[1].CardName=APKO records[1].CardNo=88043527 records[1].CreateTime=1566851904 records[1].Door=0 records[1].Method=1 records[1].Password= records[1].RecNo=1368 records[1].Status=1 records[1].URL= records[1].UserID=9901"; $delimiters = Array('/s+/',".",'='); $res = multiexplode($delimiters,$string); print_r($res);
Thanks for your help. I hope there is something that can be done to achieve this.
TaG
Advertisement
Answer
This goes along the lines of splitting the text at multiple parts with explode()
. Starting using records[
as the delimiter so that this should mean even values with spaces are maintained. Then breaking the key down into the individual components…
$parts = explode("records[", $string); // Remove empty item of start array_shift($parts); $output = []; foreach ( $parts as $part ) { list($key, $value) = explode("=", $part, 2); list($id, $field) = explode("].", $key); $output[$id][$field] = rtrim($value); } print_r($output);
gives…
Array ( [0] => Array ( [CardName] => TEST [CardNo] => 01234567 [CreateTime] => 1566835406 [Door] => 0 [Method] => 1 [Password] => [RecNo] => 1366 [Status] => 1 [URL] => [UserID] => 9901 ) [1] => Array ( [CardName] => TEST [CardNo] => 01234567 [CreateTime] => 1566851904 [Door] => 0 [Method] => 1 [Password] => [RecNo] => 1368 [Status] => 1 [URL] => [UserID] => 9901 ) )