Hey,
Can't use your example, as you check weather
$sorted is empty, if it is -> run the foreach and return,
but on next recursion when it's not empty - do nothing :)
Though I found how to cut a few seconds (on very big array),
removing the first if, and adding a $return=true to functions'
parameters, and in future calls set it to false:
function recur($array, &$sorted=array(), $pid=0, $level=0, $return=true)
{
foreach($array as $id=>$parent)
{
if($pid===$parent)
{
$sorted[$id]= $level;
unset($array[$id]);
if(in_array($id,$array)){
recur($array, &$sorted, $id, $level+1,
false);
}
}
}
if($return){return $sorted;}
}
Well, I guess that's it, I'm sure I can think of
another way to cut execution time, but, well,
I don't have much time for it :)
Thanks all!
David.
On Mon, Jun 30, 2008 at 8:24 AM, Roberto Costumero Moreno
<[EMAIL PROTECTED]> wrote:
> Hi David,
>
> That's good work ;-)
>
> You are right that my example would only return one entry for each parent.
> Didn't realized of that.
>
> I know the local copies you create in the recursive calls is not the best
> solution in efficiency, but lots of times it is better to have local copies
> of the array (in time of execution of the foreach) that the reference to it,
> and the loss is not so big.
>
> I think i would not be able to improve that function a lot, but if I come up
> a solution I will tell you.
>
> One little advice, you can get the same functionality saving a little bit of
> code, and having one variable less, so the function should look like this
> (avoiding the use of $return variable and makes the code clearer for later
> revisions):
>
> /**
> * Recursion
> * @array as ( id => parent )
> * return array as ( id => level ) maintaining arrays' initial order
> */
> function recur($array, &$sorted=array(), $pid=0, $level=0)
> {
> if(empty($sorted)){
> foreach($array as $id=>$parent)
> {
> if($pid===$parent)
> {
> $sorted[$id]= $level;
> unset($array[$id]);
> if(in_array($id,$array)){
> recur($array, &$sorted, $id, $level+1);
> }
> }
> }
> return $sorted;
> }
> }
>
> Note that return $sorted is inside the if so as to avoid returning an empty
> array. If you don't mind returning an empty array put it down the bracket.
>
> And thanks to you. I signed up to the mailing list only two days ago
> (although I've been working with PHP for at least 3 years), and you are the
> first person I help successfully (or almost). Don't ever regret of asking
> problems in the mailing list and always wait about 24 hours for someone to
> answer ;-)
>
> There are lots of people from all over the world so if the one helping your
> case is in the opposite part of the world and is asleep... it takes time ;-)
>
> Cheers,
>
> Roberto
>
>
>
>
> On Mon, Jun 30, 2008 at 17:38, David Sky <[EMAIL PROTECTED]> wrote:
>>
>> Hey Robero,
>>
>> Thanks for the answer, the none recursion function is a good idea,
>> although as provided in your example if would only return one
>> entry from each parent it can get to and it only can get to few,
>> depends on how the array is sorted.
>>
>> Basically you can make it work if you would sort the array from
>> small to high by parent value, but in my case I will get this array
>> pre-sorted by date, so I can't change the order.
>>
>> Now, about your other suggestion, yes, it will work without the reference.
>> I used the reference to avoid creating "local" copies of the array.
>>
>> I solved the problem by removing the reference just as you said, but then
>> there would be to many recursions, so I ended up with this function:
>>
>> /**
>> * Recursion
>> * @array as ( id => parent )
>> * return array as ( id => level ) maintaining arrays' initial order
>> */
>> function recur($array, &$sorted=array(), $pid=0, $level=0)
>> {
>> if(empty($sorted)){$return=true;}else{$return=false;}
>> foreach($array as $id=>$parent)
>> {
>> if($pid===$parent)
>> {
>> $sorted[$id]= $level;
>> unset($array[$id]);
>> if(in_array($id,$array)){
>> recur($array, &$sorted, $id, $level+1);
>> }
>> }
>> }
>> if($return){return $sorted;}
>> }
>>
>> Checking with in_array if parent exist in array to make
>> less runs and saving micro seconds on return... haha.
>>
>> I couldn't make it any faster, but if anybody can,
>> please, let me know, I would be happy to know how to.
>>
>>
>> Thanks Robero, this is first time I'm looking for help in mailing list,
>> and I was starting to regret writing here, but your reply changed it :)
>>
>> Thanks!
>>
>> David.
>>
>>
>>
>> On Mon, Jun 30, 2008 at 6:36 AM, Roberto Costumero Moreno
>> <[EMAIL PROTECTED]> wrote:
>> > That's not the problem. Look that the function is called with &$return,
>> > so
>> > there is a reference to the variable in which the function returns the
>> > value
>> > (if not there would not be an answer...).
>> >
>> > Otherwise, i think the problem is in the recursive call inside the
>> > function.
>> > Once you make the unset, you make a recursive call to the function like:
>> >
>> > recrusion(&$array, &$return, $id, $level+1);
>> >
>> > while I think the problem will be solved if you make the call just like:
>> >
>> > recrusion($array, &$return, $id, $level+1);
>> >
>> >
>> > Notice that the $array variable has not & symbol, so is the variable
>> > itself
>> > and not a reference of it.
>> >
>> > Although there is a better and simple solution for that problem (or I
>> > think
>> > something like this should work well):
>> >
>> >
>> > <?php
>> > function recrusion($array, $return, $pid=0, $level=0){
>> > foreach($array as $id=>$parent){
>> > if( $parent===$pid ){
>> > $return[$id]= $level;
>> > unset($array[$id]); /* remove this to get correct
>> > results */
>> >
>> > $level++;
>> > $pid = $id;
>> > }
>> > }
>> > }
>> > $return= array();
>> > $array= array(1=>0,2=>1,3=>2,4=>3,5=>2,6=>2,7=>6,8=>6,9=>0,10=>0);
>> > recrusion($array, &$return);
>> >
>> > var_dump( $return );
>> > ?>
>> >
>> > So you don't make any recursive call, you don't lose too much efficiency
>> > and
>> > it should work well for the whole array.
>> >
>> > Try the two solutions above and see whether if any is up to your
>> > problem.
>> >
>> >
>> > Cheers,
>> >
>> > Roberto
>> >
>> >
>> > On Mon, Jun 30, 2008 at 14:27, Jason Norwood-Young
>> > <[EMAIL PROTECTED]> wrote:
>> >>
>> >> On Sun, 2008-06-29 at 18:25 -0800, David Sky wrote:
>> >> > Hello everyone!
>> >> >
>> >> > A couple of days ago I submitted a bug to PHP
>> >> > http://bugs.php.net/bug.php?id=45385
>> >> > But I was mistaken, apparently it's not a bug.
>> >> > And I was "sent" here to get help.
>> >>
>> >> I think you might be forgetting to return $return.
>> >>
>> >> J
>> >>
>> >>
>> >> --
>> >> PHP General Mailing List (http://www.php.net/)
>> >> To unsubscribe, visit: http://www.php.net/unsub.php
>> >>
>> >
>> >
>
>
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php