Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to slice ArrayIterator into two?

Tags:

php

I've got this code

$second_half = $items; //ArrayIterator Object;
$first_half = array_slice($second_half ,0,ceil(count($second_half)/2));

This gives the warning Warning: array_slice() expects parameter 1 to be array, object given Is there a way to slice an ArrayIterator object in two?

Basically I want one half of the unknown amount of items stored in $first_half and the remaining items $second_half; the result would be two ArrayIterator objects with two different sets of items.

like image 735
Moak Avatar asked Oct 26 '25 02:10

Moak


2 Answers

$first_half = new LimitIterator($items, 0, ceil(count($items) / 2));
$second_half = new LimitIterator($items, iterator_count($first_half));

This will get you 2 iterator which will allow you to only iterate over a half of the original $items.

like image 178
Kick_the_BUCKET Avatar answered Oct 28 '25 16:10

Kick_the_BUCKET


It would appear you can use the getArrayCopy method of the ArrayIterator. This will return an array that you can then manipulate.

As for assigning one half of the results to a new ArrayIterator, and the other half to another ArrayIterator, you wouldn't need to reduce it to an array. You could simply use the count and append methods of the Iterator itself:

$group = new ArrayIterator;
$partA = new ArrayIterator;
$partB = new ArrayIterator;

$group->append( "Foo" );
$group->append( "Bar" );
$group->append( "Fiz" );
$group->append( "Buz" );
$group->append( "Tim" );

foreach ( $group as $key => $value ) {
  ( $key < ( $group->count() / 2 ) ) 
    ? $partA->append( $value ) 
    : $partB->append( $value );
}

This results in two new ArrayIterator's being constructed:

ArrayIterator Object ( $partA )
(
    [0] => Foo
    [1] => Bar
    [2] => Fiz
)
ArrayIterator Object ( $partB )
(
    [0] => Buz
    [1] => Tim
)

Modify the ternary condition as needed.

like image 40
Sampson Avatar answered Oct 28 '25 16:10

Sampson



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!