Skip to content

#53405 bugfix: current in foreach (by ptrofimov,dmkuznetsov) #113

Closed
wants to merge 1 commit into from

5 participants

@ptrofimov

#53405 bugfix: current in foreach (by ptrofimov,dmkuznetsov)

@lstrojny

Could you please add a test for this bugfix?

@lstrojny

ping again @ptrofimov

@ptrofimov

@lstrojny Oh, sorry. I thought everybody forgot about this pull request)) I'll add tests in few days.

@lstrojny

Nope. We never forget (alright, sometimes).

@nikic
nikic commented Feb 11, 2013

I don't think that this change is right. I'm pretty sure that the function was intentionally marked ZEND_SEND_PREFER_REF, just like key() was also.

This will change the behavior and it's unclear to me what behavior is the right one. At least this needs a bit more explanation.

If this is about making current()/key() independent of foreach() then this will only help in a limited way (esp when foreach-by-ref or foreach-over-ref is used). I have a patch that properly decouples foreach from the internal array pointer, but that's a rather more heavy change.

@lstrojny

@nikic thanks for the explanation. Do you mind closing it and open a different issue for your refactoring?

@ptrofimov

Well, the problem was that the code

$a = array(1, 2, 3);
foreach ($a as $i) {
    var_dump(current($a));
}

should give 1,1,1. But it gives 2,2,2. After this patch it gave 1,1,1.
But just the other day I downloaded latest source and wrote the test for this, and, unfortunately, it gives 2,3,false.
Why it is so, I don't know, may be something changed in new version.

Well, perhaps, we should close the issue((

@olekukonko

I don't think it should be closed until its fixed. Has the same issue once it was a mess because it gives different results http://3v4l.org/sBDjl#v430. Can you also look at http://stackoverflow.com/a/14849560/1226894 and confirm how a function affect current output when working with foreach

@nikic
nikic commented Feb 13, 2013

@lstrojny What I have was basically a try to improve performance by avoiding the array copy in foreach; the decoupling from the internal array pointer was more of a sideeffect. And as I didn't yet see performance benefits for "real" code (only in artificial benchmarks) I'm not sure we want to do that change.

@jpauli
php.net member
jpauli commented Jan 20, 2015

Closing as this subject is debatted against PHP7 actually, with a more detailed patch.

@jpauli jpauli closed this Jan 20, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.