This is a follow-up to my question yesterday - Recursive UL LI to PHP multi-dimensional array - I've almost managed to convert the HTML block to an array, though there is a slight problem that I cannot fix. When processing the HTML block below, the output array does not quite follow what has been inputted (and I cannot see where I'm going wrong and need a fresh pair of eyes!!).
I've included the following items:
- HTML Block
- PHP Function and Processing
- Output
HTML Block
Basically takes the form of:
-A
-B
-C
----
-D
-E
-F
----
-G
-H
-I
As follows:
<li>
<ul>
<li>A</li>
<li>
<ul>
<li>B</li>
<li>
<ul>
<li>C</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<ul>
<li>D</li>
<li>
<ul>
<li>E</li>
<li>
<ul>
<li>F</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<ul>
<li>G</li>
<li>
<ul>
<li>H</li>
<li>
<ul>
<li>I</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
PHP Function and Processing
function process_ul($output_data, $data, $key, $level_data, $level_key){
if(substr($data[$key], 0, 3) == '<ul'){
// going down a level in the tree
$level_key++;
// check to see if the level key exists within the level data, else create it and set to zero
if(!is_numeric($level_data[$level_key])){
$level_data[$level_key] = 0;
}
// increment the key to look at the next line
$key++;
if(substr($data[$key], 0, 4) !== '</ul'){
while(substr($data[$key], 0, 4) !== '</ul'){
// whilst we don't have an end of list, do some recursion and keep processing the array
$returnables = process_ul($output_data, $data, $key, $level_data, $level_key);
$output_data = $returnables['output'];
$data = $returnables['data'];
$key = $returnables['key'];
$level_data = $returnables['level_data'];
$level_key = $returnables['level_key'];
}
}
}
if(substr($data[$key], 0, 4) !== '</ul' && $data[$key] !== "<li>" && $data[$key] !== "</li>"){
// we don't want to be saving lines with no data or the ends of a list
// get the array key value so we know where to save it in our array (basically so we can't overwrite anything that may already exist
$this_key = &$output_data;
for($build_key=0;$build_key<($level_key+1); $build_key++){
$this_key =& $this_key[$level_data[$build_key]];
}
if(is_array($this_key)){
// look at the next key, find the next open one
$this_key[(array_pop(array_keys($this_key))+1)] = $data[$key];
} else {
// a new entry, so nothing to worry about
$this_key = $data[$key];
}
$level_data[$level_key]++;
} else if(substr($data[$key], 0, 4) == '</ul'){
// going up a level in the tree
$level_key--;
}
// increment the key to look at the next line when we loop in a moment
$key++;
// prepare the data to be returned
$return_me = array();
$return_me['output'] = $output_data;
$return_me['data'] = $data;
$return_me['key'] = $key;
$return_me['level_data'] = $level_data;
$return_me['level_key'] = $level_key;
// return the data
return $return_me;
}
// explode the data coming in by looking at the new lines
$input_array = explode("\n", $html_ul_tree_in);
// get rid of any empty lines - we don't like those
foreach($input_array as $key => $value){
if(trim($value) !== ""){
$input_data[] = trim($value);
}
}
// set the array and the starting level
$levels = array();
$levels[0] = 0;
$this_level = 0;
// loop around the data and process it
for($i=0; $i<count($input_data); $i){
$returnables = process_ul($output_data, $input_data, $i, $levels, $this_level);
$output_data = $returnables['output'];
$input_data = $returnables['data'];
$i = $returnables['key'];
$levels = $returnables['level_data'];
$this_level = $returnables['level_key'];
}
// let's see how we did
print_r($output_data);
Output
Note that D is in the wrong position, should be in position [0][2] - not [0][1][2], and every other position after D is out by 1 place (I'm sure you can tell by looking).
Basically takes the form of:
-A
-B
-C
-D
----
-E
-F
-G
----
-H
-I
As follows:
Array
(
[0] => Array
(
[0] => <li>A</li>
[1] => Array
(
[0] => <li>B</li>
[1] => Array
(
[0] => <li>C</li>
)
[2] => <li>D</li>
)
[2] => Array
(
[1] => <li>E</li>
[2] => Array
(
[1] => <li>F</li>
)
[3] => <li>G</li>
)
[3] => Array
(
[2] => <li>H</li>
[3] => Array
(
[2] => <li>I</li>
)
)
)
)
Thanks for your time - any assistance in outputting the array correctly would be greatly appreciated!
, but if they are there it simply didn't start to process it). The reason why I've done it this was is so I can process the contents of the- items - where I will need to use regex, amongst other things...
– MrJ Jan 27 '12 at 11:52