Re: Deleting elements from the middle of an array

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 3/14/2011 2:02 PM, Jim Lucas wrote:
> On 3/14/2011 1:31 PM, Paul M Foster wrote:
>> Here's what I need to do: I have an indexed array, from which I need to
>> delete elements in the middle. Once completed, the indexes should be
>> numerically in sequence, as they were when I first encountered the
>> array. That is:
>>
>> Before:
>> $arr = array(0 => 5, 1 => 6, 2 => 7, 3 => 8, 4 => 9, 5 => 10);
>>
>> After:
>> $arr = array(0 => 5, 1 => 6, 2 => 9, 3 => 10);
>>
>>
>> I've tried:
>>
>> 1) Using for() with unset(). Elements are deleted, but the indexes are
>> no longer sequential.
>>
>> 2) Using for() with array_splice(). Understandably, deletes certain
>> elements but not others.
>>
>> 3) Using foreach() with referenced array elements. Neither unset() nor
>> array_splice() appear to have any effect on the array at all.
>>
>> 4) while() loop using current() and the like. But these array functions
>> return values, not references, so the array isn't actually modified.
>>
>> 5) array_walk() with unset() array_splice(). No effect on the array.
>>
>> Anyone know how to do this, or know of a reference on how to?
>>
>> Paul
>>
> 
> <?php
> 
> # Setup match array
> $match_these = array(7,8);
> 
> # Setup data array
> $arr = array(0 => 5, 1 => 6, 2 => 7, 3 => 8, 4 => 9, 5 => 10);
> 
> # Loop data array
> foreach ( $arr AS $k => $v )
> {
>   # Simple matching this may be, but work yes it does
>   if ( in_array($v, $match_these) )
>   {
>     # Remove matched items
>     unset($arr[$k]);
>   }
> }
> 
> # Reset array indexes
> $arr = array_values($arr);
> 
> # Print it
> print_r($arr);
> 
> # $arr will now be array(0 => 5, 1 => 6, 2 => 9, 3 => 10);
> 
> ?>

Or you can do the long and more memory intense way.

<?php

# Setup match array
$match_these = array(7,8);

# Setup data array
$arr = array(0 => 5, 1 => 6, 2 => 7, 3 => 8, 4 => 9, 5 => 10);

# Setup new array()
$new_arr = array();

# Loop data array
foreach ( $arr AS $k => $v )
{
  # Simple matching this may be, but work yes it does
  if ( ! in_array($v, $match_these) ) # notice the ! (NOT)
  {
    # Remove matched items
    $new_arr[] = $arr[$k];
  }
}

# Print it
print_r($new_arr);

# $arr will now be array(0 => 5, 1 => 6, 2 => 9, 3 => 10);

?>

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux