i have a one-dimensional array with stdclasses inside, these objects have a name and a "abh" attribute. now i want to get a tree-view like multidimensional array of that. Lets say my array looks like this:
$ar = array(
(object)array("name" => "Test1","otherstuff"=>array(),"abh"=>""),
(object)array("name" => "Test2","otherstuff"=>array(),"abh"=>"Test1"),
(object)array("name" => "Test3","otherstuff"=>array(),"abh"=>"Test1"),
(object)array("name" => "Test4","otherstuff"=>array(),"abh"=>"Test1"),
(object)array("name" => "Test5","otherstuff"=>array(),"abh"=>"Test1"),
(object)array("name" => "Test6","otherstuff"=>array(),"abh"=>"Test5"),
(object)array("name" => "Test7","otherstuff"=>array(),"abh"=>"Test5"),
(object)array("name" => "Test8","otherstuff"=>array(),"abh"=>array("Test5","Test7")),
(object)array("name" => "Test9","otherstuff"=>array(),"abh"=>"Test8"),
(object)array("name" => "Test10","otherstuff"=>array(),"abh"=>"Test6"),
(object)array("name" => "Test11","otherstuff"=>array(),"abh"=>"Test9"),
);
the data cames from functions called before, not from database. The Result is something like this:
Array
(
[0] => stdClass Object
(
[name] => Test1
[otherstuff] => Array
(
)
[abh] =>
)
[1] => stdClass Object
(
[name] => Test2
[otherstuff] => Array
(
)
[abh] => Test1
)
[...]
)
so now, i want this array will become sorted by the "abh" attribute. the first one where the "abh" is empty, its the root, all others will become childs of it. so the function has to add a "childs" attribute to the main IF it has childs. But now this one is type of special because the "abh" can be a array itsself and reasign to n-parents. In my example above, the Test8 should be a child of Test5 and Test7 (clone).
I've tried to handle this with a recursive function and loops in a foreach. In there it checks the abh of a element againts parents thats exists, but dont work. array_filter() doenst do that like i want.
so, i want this result:
Array
(
[Test1] => stdClass Object
(
[name] => Test1
[otherstuff] => Array()
[abh] =>
[childs] => Array
(
[Test2] => stdClass Object
[...] and so on
)
)
)
any ideas about that? i also dont know how much "levels" the returned array will have, thats on how much input objects and "abh"-assignes exists. The seconds is that the "abh" array can have up to 10 "parents".
Thanks for any help!
as requestet my non-working prototyp for that "sorter"
function checkABH(&$return,&$ar,$deph) {
// clone all with array-abh
$count = count($ar);
for($x=0;$x<$count;$x++) {#$ar as$key=>$val) {
if(is_array($ar[$x]->abh)) {
$clone = $ar[$x];
foreach($ar[$x]->abh as$abh) {
#echo "<br>$x @@ $abh";
$clone->abh = $abh;
$ar[] = $clone;
#echo '<pre>'.print_r($clone,true).'</pre>';
}
// delete array-abh-element
unset($ar[$x]);
}
}
echo '<pre>'.print_r($ar,true).'</pre>';
echo '</div>';
echo '<div style="float:left;width:auto;margin:0px 10px;"><h3>Result:</h3>';
// pass to sorter
checkABH_a($return,$ar,$deph);
}
function checkABH_a(&$return,&$ar,$deph) {
$test_abhs = array();
foreach($ar as$key=>$val) {
$val->childs = array();
if(isset($return[$deph])&&isset($return[$deph]->name)&&$val->abh==$return[$deph]->name) {
$return[$deph]->childs[] = $val;
unset($ar[$key]);
} elseif($val->abh==$deph) {
$return[$val->abh] = $val;
unset($ar[$key]);
} else {
$test_abhs[] = $val->abh;
}
}
if(count($test_abhs)>0) {
$test_abhs = array_unique($test_abhs);
#echo '<pre>'.print_r($test_abhs,true).'</pre>';
foreach($test_abhs as$abh) {
checkABH_a($return,$ar,$abh);
}
}
}
echo '<div style="float:left;width:260px;border-right:1px solid #cccccc;margin:0px 10px;"><h3>Input</h3>';
echo '<pre>'.print_r($ar,true).'</pre>';
echo '</div>';
echo '<div style="float:left;width:260px;border-right:1px solid #cccccc;margin:0px 10px;"><h3>Cloned:</h3>';
$return = array();
checkABH($return,$ar,"");
echo'<pre>'.print_r($return,true).'</pre>';
echo '</div>';