Welcome! Log In Create A New Profile

Advanced

[PHP-DEV] removing an item from an array

Posted by Rasmus Schultz 
Rasmus Schultz
[PHP-DEV] removing an item from an array
August 15, 2012 10:20PM
How come there is no straight-foward obvious way to simply remove a given
value from an array?

Just look at the number of horrible ways people solve this obvious problem:

http://stackoverflow.com/questions/7225070/php-array-delete-by-value-not-key

Shouldn't we have something simple, like:

array_remove($array, $value) : array (returns a new array)

and/or

array_delete(&$array, $value) : bool (modifies array directly)

?
Stas Malyshev
Re: [PHP-DEV] removing an item from an array
August 15, 2012 10:30PM
Hi!

> How come there is no straight-foward obvious way to simply remove a given
> value from an array?

The same reason there's no simple way to undefine variable whose value
is 42 without knowing the variable name. Array is a container indexed by
keys, not values. So if you've got just a value, there's no way to know
if it's in the container at all, and if it is, where it is, except for
going through all the values and checking if any of them is equal to
what you nedd.

> Just look at the number of horrible ways people solve this obvious problem:

I see:
if(($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
}

Nothing horrible here.

--
Stanislav Malyshev, Software Architect
SugarCRM: http://www.sugarcrm.com/
(408)454-6900 ext. 227

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Will Fitch
Re: [PHP-DEV] removing an item from an array
August 15, 2012 10:30PM
I like that chose 42 for the value. You win, and I completely agree.

On Wed, Aug 15, 2012 at 4:22 PM, Stas Malyshev <[email protected]>wrote:

> Hi!
>
> > How come there is no straight-foward obvious way to simply remove a given
> > value from an array?
>
> The same reason there's no simple way to undefine variable whose value
> is 42 without knowing the variable name. Array is a container indexed by
> keys, not values. So if you've got just a value, there's no way to know
> if it's in the container at all, and if it is, where it is, except for
> going through all the values and checking if any of them is equal to
> what you nedd.
>
> > Just look at the number of horrible ways people solve this obvious
> problem:
>
> I see:
> if(($key = array_search($del_val, $messages)) !== false) {
> unset($messages[$key]);
> }
>
> Nothing horrible here.
>
> --
> Stanislav Malyshev, Software Architect
> SugarCRM: http://www.sugarcrm.com/
> (408)454-6900 ext. 227
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
Nikita Popov
Re: [PHP-DEV] removing an item from an array
August 15, 2012 10:30PM
On Wed, Aug 15, 2012 at 10:22 PM, Stas Malyshev <[email protected]> wrote:
> Hi!
>
>> How come there is no straight-foward obvious way to simply remove a given
>> value from an array?
>
> The same reason there's no simple way to undefine variable whose value
> is 42 without knowing the variable name. Array is a container indexed by
> keys, not values. So if you've got just a value, there's no way to know
> if it's in the container at all, and if it is, where it is, except for
> going through all the values and checking if any of them is equal to
> what you nedd.
>
>> Just look at the number of horrible ways people solve this obvious problem:
>
> I see:
> if(($key = array_search($del_val, $messages)) !== false) {
> unset($messages[$key]);
> }
>
> Nothing horrible here.

In addition to that, one should be aware that a value can exist
multiple times in an array, whereas keys are unique. So there are
infinitely many possible deletion strategies.

Btw, deleting all values (not just the first) is also very easy currently:

foreach (array_keys($array, $delValue) as $key) {
unset($array[$key]);
}

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Kris Craig
Re: [PHP-DEV] removing an item from an array
August 15, 2012 10:40PM
>
>
> Btw, deleting all values (not just the first) is also very easy currently:
>
> foreach (array_keys($array, $delValue) as $key) {
> unset($array[$key]);
> }
>
>
Even easier still, just do this:

$array_var = array();

--Kris
Nikita Popov
Re: [PHP-DEV] removing an item from an array
August 15, 2012 10:40PM
On Wed, Aug 15, 2012 at 10:29 PM, Kris Craig <[email protected]> wrote:
>>
>> Btw, deleting all values (not just the first) is also very easy currently:
>>
>> foreach (array_keys($array, $delValue) as $key) {
>> unset($array[$key]);
>> }
>>
>
> Even easier still, just do this:
>
> $array_var = array();

It's often overlooked, but array_keys has a second parameter that only
returns the keys for a certain value: http://php.net/array_keys ;) So
no, that does not clean off the whole array.

Nikita

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Kris Craig
Re: [PHP-DEV] removing an item from an array
August 15, 2012 10:40PM
On Wed, Aug 15, 2012 at 1:31 PM, Nikita Popov <[email protected]> wrote:

> On Wed, Aug 15, 2012 at 10:29 PM, Kris Craig <[email protected]> wrote:
> >>
> >> Btw, deleting all values (not just the first) is also very easy
> currently:
> >>
> >> foreach (array_keys($array, $delValue) as $key) {
> >> unset($array[$key]);
> >> }
> >>
> >
> > Even easier still, just do this:
> >
> > $array_var = array();
>
> It's often overlooked, but array_keys has a second parameter that only
> returns the keys for a certain value: http://php.net/array_keys ;) So
> no, that does not clean off the whole array.
>
> Nikita
>

If you re-initialize it by setting it to array(), then yes that most
definitely will clear all the values in the array. As far as I know,
array_keys() has nothing to do with that.

--Kris
Kris Craig
Re: [PHP-DEV] removing an item from an array
August 15, 2012 10:40PM
On Wed, Aug 15, 2012 at 1:35 PM, Kris Craig <[email protected]> wrote:

>
>
> On Wed, Aug 15, 2012 at 1:31 PM, Nikita Popov <[email protected]>wrote:
>
>> On Wed, Aug 15, 2012 at 10:29 PM, Kris Craig <[email protected]>
>> wrote:
>> >>
>> >> Btw, deleting all values (not just the first) is also very easy
>> currently:
>> >>
>> >> foreach (array_keys($array, $delValue) as $key) {
>> >> unset($array[$key]);
>> >> }
>> >>
>> >
>> > Even easier still, just do this:
>> >
>> > $array_var = array();
>>
>> It's often overlooked, but array_keys has a second parameter that only
>> returns the keys for a certain value: http://php.net/array_keys ;) So
>> no, that does not clean off the whole array.
>>
>> Nikita
>>
>
> If you re-initialize it by setting it to array(), then yes that most
> definitely will clear all the values in the array. As far as I know,
> array_keys() has nothing to do with that.
>
> --Kris
>
>
Err nevermind, I think I misread what you were trying to do. If you want
to only clear a certain value, then yes using array_keys() with a search
value specified is the way to go. If you want to clear all values in the
array period (which is what I thought you were saying), then
re-initializing with array() makes the most sense.

--Kris
Morgan L. Owens
Re: Re: [PHP-DEV] removing an item from an array
August 16, 2012 02:10AM
On 2012-08-16 08:27, Nikita Popov wrote:
> On Wed, Aug 15, 2012 at 10:22 PM, Stas Malyshev <[email protected]> wrote:
>> Hi!
>>
>>> How come there is no straight-foward obvious way to simply remove a given
>>> value from an array?
>>> Just look at the number of horrible ways people solve this obvious problem:
>>
>> I see:
>> if(($key = array_search($del_val, $messages)) !== false) {
>> unset($messages[$key]);
>> }
>>
>> Nothing horrible here.
>
> Btw, deleting all values (not just the first) is also very easy currently:
>
> foreach (array_keys($array, $delValue) as $key) {
> unset($array[$key]);
> }
>
$array = array_diff($array, [$delValue]);



--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Tyler L
Re: Re: [PHP-DEV] removing an item from an array
August 16, 2012 06:30AM
On Wed, Aug 15, 2012 at 7:59 PM, Morgan L. Owens <[email protected]>wrote:

> On 2012-08-16 08:27, Nikita Popov wrote:
>
>> On Wed, Aug 15, 2012 at 10:22 PM, Stas Malyshev <[email protected]>
>> wrote:
>>
>>> Hi!
>>>
>>> How come there is no straight-foward obvious way to simply remove a
>>>> given
>>>> value from an array?
>>>> Just look at the number of horrible ways people solve this obvious
>>>> problem:
>>>>
>>>
>>> I see:
>>> if(($key = array_search($del_val, $messages)) !== false) {
>>> unset($messages[$key]);
>>> }
>>>
>>> Nothing horrible here.
>>>
>>
>> Btw, deleting all values (not just the first) is also very easy currently:
>>
>> foreach (array_keys($array, $delValue) as $key) {
>> unset($array[$key]);
>> }
>>
>> $array = array_diff($array, [$delValue]);
>
>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
http://php.net/array_flip

This is my favourite way of removing a value:
$kv = array( 1 => 'a', 2 => 'b', 3 => 'c');
$vk = array_flip($kv);
unset($vk['b']);
$kv = array_flip($vk);
Lars Schultz
Re: [PHP-DEV] removing an item from an array
August 16, 2012 07:50AM
Am 15.08.2012 22:22, schrieb Stas Malyshev:
>> Just look at the number of horrible ways people solve this obvious problem:
>
> I see:
> if(($key = array_search($del_val, $messages)) !== false) {
> unset($messages[$key]);
> }
>
> Nothing horrible here.
>
One thing that should be noted in this case and any solution that relies
on unset() is that even though its simple and fast, it will not result
in a properly indexed array. The same goes for any array_diff based
solution.

I tried and compared the following solutions and ordered them according
to their performance. The fastest (and with a correct result) solution
is based on array_slice. Why this is the case I can not say...I am not
arguing for another array-function (as there are so many already)...but
I certainly have my own array_remove implementation, since it's such a
common use-case.

function array_remove_slice(&$haystack,$needle){
while ( true ) {
$pos = array_search($needle,$haystack,true);
if ( $pos === false ) return;

$haystack = array_merge(
array_slice($haystack,0,$pos) ,
array_slice($haystack,$pos+1)
);
}
}

/* ~1.5 times slower than slice */
function array_remove_unset(&$haystack,$needle){
while ( true ) {
$pos = array_search($needle,$haystack,true);
if ( $pos === false ) break;

unset($haystack[$pos]);
}
}

/* ~2.3 times slower than slice */
function array_remove_loop(&$haystack,$needle){
$result = array();
foreach( $haystack as $value ) {
if ( $needle == $value ) continue;
$result[] = $value;
}
$haystack = $result;
}


/* ~3.5 times slower than slice */
function array_remove_diff(&$haystack,$needle){
$haystack = array_diff($haystack,array($needle));
}


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Sherif Ramadan
Re: Re: [PHP-DEV] removing an item from an array
August 16, 2012 08:00AM
>
> This is my favourite way of removing a value:
> $kv = array( 1 => 'a', 2 => 'b', 3 => 'c');
> $vk = array_flip($kv);
> unset($vk['b']);
> $kv = array_flip($vk);


That doesn't make any sense. What if the values are present more than
once? array_flip will cause the keys to be overwritten.

$array = array('foo','bar','baz','baz');
$flipped_array = array_flip($array);
unset($flipped_array['foo']);
$array = array_flip($flipped_array);
var_dump($array);

Now your array is something completely different from what you wanted.
The solution stated earlier is the most sane one (just using
array_keys() with a search value).

The problem isn't very complicated and doesn't require a complex solution.

This thread is overstating a rudimentary problem (and that's the lack
of understanding PHP arrays).

Unlike most other languages PHP's arrays aren't really arrays, because
they don't create a list of values, but instead create an ordered
hashmap, which in-turn solves a wide variety of general problems such
as the ability to create dictionaries as well as ordered lists, which
-- when combining all general use cases that the PHP array aims to
solve -- is otherwise going to require having additional multiple
primitives for each use case.

For example in Python you need a combination of Tuples and Arrays to
achieve similar map structures. PHP aims to make this a more
simplified general use case primitive by abstracting away most of this
low-level work for you in the user-space code.

I don't wish to degrade anyone's contributions to this thread, but
this really is the perfect example of making a lot of fuss over
nothing on the mailing list and an example of the kinds of discussion
we should be avoiding when there are so many other important problems
we can solve.

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Lars Schultz
Re: [PHP-DEV] removing an item from an array
August 16, 2012 08:50AM
Am 16.08.2012 07:55, schrieb Sherif Ramadan:
> Now your array is something completely different from what you wanted.
> The solution stated earlier is the most sane one (just using
> array_keys() with a search value).

the array_keys solution is slower (although barely) than my suggested
array_slice solution but comes up short when looking at the result
closely. The resulting array won't be properly indexed anymore, but will
be a numbered hashmap. I am not sure wether PHP keeps an internal state
on wether an array is a map or a classic array, but when you require
indizes to be sequential (without gaps) then unset() just won't do. Thus
it's not always a simple problem.

> I don't wish to degrade anyone's contributions to this thread, but
> this really is the perfect example of making a lot of fuss over
> nothing on the mailing list and an example of the kinds of discussion
> we should be avoiding when there are so many other important problems
> we can solve.

Rasmus' suggestion was very concise and unfussy. I've been wondering the
same thing for some time. It would make the array-functionset more
complete and code more explicit. Why should we only talk about major
changes and additions?


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Morgan L. Owens
Re: [PHP-DEV] removing an item from an array
August 16, 2012 09:00AM
On 2012-08-16 17:55, Sherif Ramadan wrote:
> That doesn't make any sense. What if the values are present more than
> once? array_flip will cause the keys to be overwritten.
>
Not to mention converting all of the array's elements to strings and/or
integers.

>
> Now your array is something completely different from what you wanted.
> The solution stated earlier is the most sane one (just using
> array_keys() with a search value).
>
> The problem isn't very complicated and doesn't require a complex solution.
>
> This thread is overstating a rudimentary problem (and that's the lack
> of understanding PHP arrays).
>
I was actually alluding to something more disturbing:
<?php
$array = [['foo', 'bar'], ['wibble', 'fnord']];

$array = array_diff($array, [['wibble', 'fnord']]);

print_r($array);
?>
....which makes array_diff and its ilk only useful for scalar elements
(hence the need for the more complicated approach using array_keys(),
which provides a strictness flag).



--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Lester Caine
Re: [PHP-DEV] removing an item from an array
August 16, 2012 09:30AM
Sherif Ramadan wrote:
> I don't wish to degrade anyone's contributions to this thread, but
> this really is the perfect example of making a lot of fuss over
> nothing on the mailing list and an example of the kinds of discussion
> we should be avoiding when there are so many other important problems
> we can solve.

While discussing use cases may be better done on the general list ... where it
will help users understand the differences ... Lars comparisons of approaches is
an ideal example of an internals discussion over whether an extra shortcut is
needed and how it might be implemented.

Given some of the discussions here on how to remove a few characters from
something that IS irrelevant, it's nice to see a thread that I can follow,
understand, and does contribute to tidying and improving the performance of
code. The arrays API is one area that has been flagged as needing rationalising
and Lars examples are good explanation of why?

--
Lester Caine - G8HFL
-----------------------------
Contact - http://lsces.co.uk/wiki/?page=contact
L.S.Caine Electronic Services - http://lsces.co.uk
EnquirySolve - http://enquirysolve.com/
Model Engineers Digital Workshop - http://medw.co.uk
Rainbow Digital Media - http://rainbowdigitalmedia.co.uk



--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Sherif Ramadan
Re: [PHP-DEV] removing an item from an array
August 18, 2012 07:10AM
On Thu, Aug 16, 2012 at 2:39 AM, Lars Schultz <[email protected]> wrote:
> Am 16.08.2012 07:55, schrieb Sherif Ramadan:
>
>> Now your array is something completely different from what you wanted.
>> The solution stated earlier is the most sane one (just using
>> array_keys() with a search value).
>
>
> the array_keys solution is slower (although barely) than my suggested
> array_slice solution but comes up short when looking at the result closely.
> The resulting array won't be properly indexed anymore, but will be a
> numbered hashmap. I am not sure wether PHP keeps an internal state on wether
> an array is a map or a classic array, but when you require indizes to be
> sequential (without gaps) then unset() just won't do. Thus it's not always a
> simple problem.
>


Efficiency is only secondary to effectiveness. Either the
function/implementation does what you want or it doesn't.

Further more, your assumption here that the result is incorrect (or
improperly indexed) is completely baseless and moot. You are making a
bold assumption that I both care about the keys and that I expect them
to be numeric and sequential (why can't I have string keys?). This
would also entail that I depend on keys for order (which is not a
requirement for a PHP Array since all PHP Arrays are
ordered-hashmaps).

$array = (99=>1, 7=>2, 701=>3);
foreach ($array as $v) {
echo "$v\n";
}
/* Output is as expected
1
2
3
*/

unset($array[7]);

foreach ($array as $v) {
echo "$v\n";
}
/* Output is still as expected
1
3
*/

The order of the elements in the array has not been affected by the
keys that index them or the use of unset() in the least. So your
argument holds no merit. If you are depending on the sequence of the
keys to determine the order of your elements you made a huge mistake,
because the array was already designed to store elements in order
regardless of whether you provide a key or not. So you're solving the
wrong problem here.

>
>> I don't wish to degrade anyone's contributions to this thread, but
>> this really is the perfect example of making a lot of fuss over
>> nothing on the mailing list and an example of the kinds of discussion
>> we should be avoiding when there are so many other important problems
>> we can solve.
>
>
> Rasmus' suggestion was very concise and unfussy. I've been wondering the
> same thing for some time. It would make the array-functionset more complete
> and code more explicit. Why should we only talk about major changes and
> additions?
>
>

I never said it was redundant or fussy.

Here you're advocating that you're "for" this feature and yet just a
few posts earlier you explicitly state (and I quote):

"I am not arguing for another array-function (as there are so many already)"

This is exactly the kind of noise I see people making in these types
of threads. On one hand they argue indifference (and yet they're here
making all sorts of claims), and on the other hand they want to argue
for arguments sake (like where they're contradicting themselves like
you have).

On one hand you're saying "It would make the array-functionset more
complete" and on the other hand you're also saying "...there are so
many (array functions) already..."

Which is it?

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Alexey Zakhlestin
Re: [PHP-DEV] removing an item from an array
August 18, 2012 08:50AM
On 16.08.2012, at 0:18, Rasmus Schultz <[email protected]> wrote:

> How come there is no straight-foward obvious way to simply remove a given
> value from an array?

Well, this sounds like a reason for creating SplSet class


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Levi Morrison
Re: [PHP-DEV] removing an item from an array
August 18, 2012 06:10PM
On Sat, Aug 18, 2012 at 12:42 AM, Alexey Zakhlestin <[email protected]> wrote:
>
> On 16.08.2012, at 0:18, Rasmus Schultz <[email protected]> wrote:
>
>> How come there is no straight-foward obvious way to simply remove a given
>> value from an array?
>
> Well, this sounds like a reason for creating SplSet class
>

There's already SplObjectStorage which CAN act like a Set for objects
only. It's a terrible solution in my opinion and am working on
creating a proper one. I don't know if that effort will be accepted,
but I wanted to point out that a set already exists in the SPL.

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Morgan L. Owens
Re: Re: [PHP-DEV] removing an item from an array
August 19, 2012 09:00AM
On 2012-08-19 04:08, Levi Morrison wrote:
> On Sat, Aug 18, 2012 at 12:42 AM, Alexey Zakhlestin <[email protected]> wrote:
>>
>> On 16.08.2012, at 0:18, Rasmus Schultz <[email protected]> wrote:
>>
>>> How come there is no straight-foward obvious way to simply remove a given
>>> value from an array?
>>
>> Well, this sounds like a reason for creating SplSet class
>>
>
> There's already SplObjectStorage which CAN act like a Set for objects
> only. It's a terrible solution in my opinion and am working on
> creating a proper one. I don't know if that effort will be accepted,
> but I wanted to point out that a set already exists in the SPL.
>
SplObjectStorage would indeed cover one given example:

On 2012-08-19 10:18, Andrew Faulds wrote:
> Hmm. I can think of a particular instance I've needed to remove an
> item from an array by value, and where keys wouldn't be an option. In
> PHP you can only have string or int keys, you can't have object keys.
> In Python, I've used Twisted (an excellent asynchronous OOP
> networking framework) to write client-server applications. One thing
> I did was maintain a list of clients (that is, a Python list). When a
> client disconnected, I would do list.remove(client). Of course there
> might be better ways to implement this, but it was simple and worked.
> Anything wrong with allowing the same in PHP?
>
SplObjectStorage even has a detach() method for removing an element by
value, as well as implementing the various array access interfaces.



--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Lars Schultz
Re: [PHP-DEV] removing an item from an array
August 20, 2012 08:00AM
Sorry for creating more "noise"...

Am 18.08.2012 06:59, schrieb Sherif Ramadan:
> Further more, your assumption here that the result is incorrect (or
> improperly indexed) is completely baseless and moot. You are making a
> bold assumption that I both care about the keys and that I expect them
> to be numeric and sequential (why can't I have string keys?). This
> would also entail that I depend on keys for order (which is not a
> requirement for a PHP Array since all PHP Arrays are
> ordered-hashmaps).

I don't assume anything. I only stated a use-case where unset() will not
work. I neatly listed some solutions and pointed out their
merits...mostly to show that there are less than ideal solutions out
there that will either perform badly or worse, not work properly at all.

> The order of the elements in the array has not been affected by the
> keys that index them or the use of unset() in the least. So your
> argument holds no merit. If you are depending on the sequence of the
> keys to determine the order of your elements you made a huge mistake,
> because the array was already designed to store elements in order
> regardless of whether you provide a key or not. So you're solving the
> wrong problem here.

Rest assured, I do know how PHP arrays work. I don't see what the
ordering has to do with wanting to keep an array sequentially-indexed.

> I never said it was redundant or fussy.
I am going to stop here, for the sake of noiselessness.


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Rasmus Schultz
Re: [PHP-DEV] removing an item from an array
August 20, 2012 05:40PM
I think adding more collection-types is the intuitive reaction to this
issue, but there's something to be said for the idea of having only a
single collection-type - I think that's one PHP feature we should not give
up.

Not having to pick and choose (and compromise) to select the "right"
collection-type, and not having to refactor when you realize you needed
another collection-type - as well as easy comprehension for developers...
these are valuable aspects of having only a single collection-type. Some
newer languages like Opa embrace that idea with great elegance. Giving up
on that idea should be the last option, in my opinion.

There are plenty of cases for collections of objects that do not have a
scalar key, where the key is indeterminate, or where the key can change -
and thus cannot have known indexes.

As an aside note, I recently benchmarked array_search() for a project that
needs to store many different types of objects in a list - and searching a
list with 1000 objects for one specific object is extremely fast: a couple
of micro-seconds more (per search) when compared against a hash-based
lookup with a known key, so (in my case) nothing to worry about at all in
terms of performance.

Arrays are a powerful and pure feature in PHP - I would vote against
introducing more collection-types, and instead leverage the already
powerful and well-understood existing singular collection-type.


On Sat, Aug 18, 2012 at 2:42 AM, Alexey Zakhlestin <[email protected]>wrote:

>
> On 16.08.2012, at 0:18, Rasmus Schultz <[email protected]> wrote:
>
> > How come there is no straight-foward obvious way to simply remove a given
> > value from an array?
>
> Well, this sounds like a reason for creating SplSet class
>
>
Yasuo Ohgaki
Re: [PHP-DEV] removing an item from an array
August 22, 2012 03:50AM
Hi,

2012/8/16 Rasmus Schultz <[email protected]>:
> How come there is no straight-foward obvious way to simply remove a given
> value from an array?
>
> Just look at the number of horrible ways people solve this obvious problem:
>
> http://stackoverflow.com/questions/7225070/php-array-delete-by-value-not-key
>
> Shouldn't we have something simple, like:
>
> array_remove($array, $value) : array (returns a new array)
>
> and/or
>
> array_delete(&$array, $value) : bool (modifies array directly)
>
> ?

It was amazing that this thread has close to 90 mails.

I've added some use cases of array_udelete() to wiki, since
some people fails to see how it could be useful. I also bring
back to array_walk() version of equivalent example. I just
don't see any reason why we should replace it with slower
foreach() version.

I think the RFC page is almost complete.

https://wiki.php.net/rfc/array_delete

Any more comments?

--
Yasuo Ohgaki
yohgaki@ohgaki.net

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Levi Morrison
Re: [PHP-DEV] removing an item from an array
August 22, 2012 04:10AM
On Tue, Aug 21, 2012 at 7:45 PM, Yasuo Ohgaki <[email protected]> wrote:
>
> Hi,
>
> 2012/8/16 Rasmus Schultz <[email protected]>:
> > How come there is no straight-foward obvious way to simply remove a given
> > value from an array?
> >
> > Just look at the number of horrible ways people solve this obvious problem:
> >
> > http://stackoverflow.com/questions/7225070/php-array-delete-by-value-not-key
> >
> > Shouldn't we have something simple, like:
> >
> > array_remove($array, $value) : array (returns a new array)
> >
> > and/or
> >
> > array_delete(&$array, $value) : bool (modifies array directly)
> >
> > ?
>
> It was amazing that this thread has close to 90 mails.
>
> I've added some use cases of array_udelete() to wiki, since
> some people fails to see how it could be useful. I also bring
> back to array_walk() version of equivalent example. I just
> don't see any reason why we should replace it with slower
> foreach() version.
>
> I think the RFC page is almost complete.
>
> https://wiki.php.net/rfc/array_delete
>
> Any more comments?
>
> --
> Yasuo Ohgaki
> yohgaki@ohgaki.net

Take a look at:
http://php.net/manual/en/function.array-walk.php#refsect1-function.array-walk-parameters

Look at funcname parameter. Notice:
> Only the values of the array may potentially be changed; its structure cannot be altered, i.e., the programmer cannot add, unset or reorder elements.. If the callback does not respect this requirement, the behavior of this function is undefined, and unpredictable.

I'm just going to change the behavior back when you switch it to
array_walk. It's less clear and technically undefined.

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Yasuo Ohgaki
Re: [PHP-DEV] removing an item from an array
August 22, 2012 04:20AM
Hi,

2012/8/22 Levi Morrison <[email protected]>:
> On Tue, Aug 21, 2012 at 7:45 PM, Yasuo Ohgaki <[email protected]> wrote:
>>
>> Hi,
>>
>> 2012/8/16 Rasmus Schultz <[email protected]>:
>> > How come there is no straight-foward obvious way to simply remove a given
>> > value from an array?
>> >
>> > Just look at the number of horrible ways people solve this obvious problem:
>> >
>> > http://stackoverflow.com/questions/7225070/php-array-delete-by-value-not-key
>> >
>> > Shouldn't we have something simple, like:
>> >
>> > array_remove($array, $value) : array (returns a new array)
>> >
>> > and/or
>> >
>> > array_delete(&$array, $value) : bool (modifies array directly)
>> >
>> > ?
>>
>> It was amazing that this thread has close to 90 mails.
>>
>> I've added some use cases of array_udelete() to wiki, since
>> some people fails to see how it could be useful. I also bring
>> back to array_walk() version of equivalent example. I just
>> don't see any reason why we should replace it with slower
>> foreach() version.
>>
>> I think the RFC page is almost complete.
>>
>> https://wiki.php.net/rfc/array_delete
>>
>> Any more comments?
>>
>> --
>> Yasuo Ohgaki
>> yohgaki@ohgaki.net
>
> Take a look at:
> http://php.net/manual/en/function.array-walk.php#refsect1-function.array-walk-parameters
>
> Look at funcname parameter. Notice:
>> Only the values of the array may potentially be changed; its structure cannot be altered, i.e., the programmer cannot add, unset or reorder elements. If the callback does not respect this requirement, the behavior of this function is undefined, and unpredictable.
>
> I'm just going to change the behavior back when you switch it to
> array_walk. It's less clear and technically undefined.

Ok, then my commit to the doc was outstanding still.
Old PHP was behaved badly with reference variables.
I'll remove obsolete statement.

I'll fix it later.
Thank you.

--
Yasuo Ohgaki
yohgaki@ohgaki.net

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Andrew Faulds
Re: [PHP-DEV] removing an item from an array
August 22, 2012 09:00AM
Um, Yasuo, have you looked at array_walk implementation and ascertained it is safe to change array structure while using it?

Because I'm worried you're changing docs without doing so.

--
Sent from Samsung Mobile
Andrew Faulds
http://ajf.me/

Yasuo Ohgaki <[email protected]> wrote:

Hi,

2012/8/22 Levi Morrison <[email protected]>:
> On Tue, Aug 21, 2012 at 7:45 PM, Yasuo Ohgaki <[email protected]> wrote:
>>
>> Hi,
>>
>> 2012/8/16 Rasmus Schultz <rasmu[email protected]>:
>> > How come there is no straight-foward obvious way to simply remove a given
>> > value from an array?
>> >
>> > Just look at the number of horrible ways people solve this obvious problem:
>> >
>> > http://stackoverflow.com/questions/7225070/php-array-delete-by-value-not-key
>> >
>> > Shouldn't we have something simple, like:
>> >
>> >     array_remove($array, $value) : array (returns a new array)
>> >
>> > and/or
>> >
>> >     array_delete(&$array, $value) : bool (modifies array directly)
>> >
>> > ?
>>
>> It was amazing that this thread has close to 90 mails.
>>
>> I've added some use cases of array_udelete() to wiki, since
>> some people fails to see how it could be useful. I also bring
>> back to array_walk() version of equivalent example. I just
>> don't see any reason why we should replace it with slower
>> foreach() version.
>>
>> I think the RFC page is almost complete.
>>
>> https://wiki.php.net/rfc/array_delete
>>
>> Any more comments?
>>
>> --
>> Yasuo Ohgaki
>> yohgaki@ohgaki.net
>
> Take a look at:
> http://php.net/manual/en/function.array-walk.php#refsect1-function.array-walk-parameters
>
> Look at funcname parameter.  Notice:
>> Only the values of the array may potentially be changed; its structure cannot be altered, i.e., the programmer cannot add, unset or reorder elements. If the callback does not respect this requirement, the behavior of this function is undefined, and unpredictable.
>
> I'm just going to change the behavior back when you switch it to
> array_walk. It's less clear and technically undefined.

Ok, then my commit to the doc was outstanding still.
Old PHP was behaved badly with reference variables.
I'll remove obsolete statement.

I'll fix it later.
Thank you.

--
Yasuo Ohgaki
yohgaki@ohgaki.net

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Yasuo Ohgaki
Re: [PHP-DEV] removing an item from an array
August 23, 2012 08:30AM
Hi,

2012/8/22 Andrew Faulds <[email protected]>:
> Um, Yasuo, have you looked at array_walk implementation and ascertained it
> is safe to change array structure while using it?
>
> Because I'm worried you're changing docs without doing so.

Simply deleting current element is safe.
It's done in everywhere in PHP. It's just like deleting elements with
zend hash.

array_walk() could bite users.
If programmer sort or delete element to be processed next, it causes problem.
PHP programmer will not sort or delete next element to processed while working
with zend hash, but average PHP users do not care about internal.

I finally understand why people use array_filter() to delete elements and
I think we should have array_udelete() since the API is much safer than
array_walk().

Regards,

--
Yasuo Ohgaki
yohgaki@ohgaki.net

>
> --
> Sent from Samsung Mobile
> Andrew Faulds
> http://ajf.me/
>
>
>
> Yasuo Ohgaki <[email protected]> wrote:
>
>
> Hi,
>
> 2012/8/22 Levi Morrison <[email protected]>:
>> On Tue, Aug 21, 2012 at 7:45 PM, Yasuo Ohgaki <[email protected]> wrote:
>>>
>>> Hi,
>>>
>>> 2012/8/16 Rasmus Schultz <[email protected]>:
>>> > How come there is no straight-foward obvious way to simply remove a
>>> > given
>>> > value from an array?
>>> >
>>> > Just look at the number of horrible ways people solve this obvious
>>> > problem:
>>> >
>>> >
>>> > http://stackoverflow.com/questions/7225070/php-array-delete-by-value-not-key
>>> >
>>> > Shouldn't we have something simple, like:
>>> >
>>> > array_remove($array, $value) : array (returns a new array)
>>> >
>>> > and/or
>>> >
>>> > array_delete(&$array, $value) : bool (modifies array directly)
>>> >
>>> > ?
>>>
>>> It was amazing that this thread has close to 90 mails.
>>>
>>> I've added some use cases of array_udelete() to wiki, since
>>> some people fails to see how it could be useful. I also bring
>>> back to array_walk() version of equivalent example. I just
>>> don't see any reason why we should replace it with slower
>>> foreach() version.
>>>
>>> I think the RFC page is almost complete.
>>>
>>> https://wiki.php.net/rfc/array_delete
>>>
>>> Any more comments?
>>>
>>> --
>>> Yasuo Ohgaki
>>> yohgaki@ohgaki.net
>>
>> Take a look at:
>>
>> http://php.net/manual/en/function.array-walk.php#refsect1-function.array-walk-parameters
>>
>> Look at funcname parameter. Notice:
>>> Only the values of the array may potentially be changed; its structure
>>> cannot be altered, i.e., the programmer cannot add, unset or reorder
>>> elements. If the callback does not respect this requirement, the behavior of
>>> this function is undefined, and unpredictable.
>>
>> I'm just going to change the behavior back when you switch it to
>> array_walk. It's less clear and technically undefined.
>
> Ok, then my commit to the doc was outstanding still.
> Old PHP was behaved badly with reference variables.
> I'll remove obsolete statement.
>
> I'll fix it later.
> Thank you.
>
> --
> Yasuo Ohgaki
> yohgaki@ohgaki.net
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Sorry, only registered users may post in this forum.

Click here to login