<?php
interface ArrayHelperInterface extends
IteratorAggregate,
ArrayAccess,
Countable {
/**
* @param ArrayHelperInterface|ArrayObject|array $array
*/
function __construct($array);
/**
* Creates a new array with the results of calling a provided function on every element in the ArrayHelperInterface.
* @param $callback
* @return ArrayHelperInterface
*/
public function map($callback);
/**
* Calls a function for each element in the ArrayHelperInterface.
* @param $callback
* @return void
*/
public function each($callback);
/**
* Returns true if at least one element in the array satisfies the provided testing function.
* @dev must finish iteration after first matching
* @param Closure|string $callback
* @return boolean
*/
public function some($callback);
/**
* Returns true if every element in the array satisfies the provided testing function.
* @param Closure|string $callback
* @return boolean
*/
public function every($callback);
}
class ArrayHelper implements ArrayHelperInterface
{
public $array;
public function __construct($array) {
$this->array = $array;
}
public function count() {
return ++$this;
}
public function each($callback) {
foreach ($this->array as $key => $value)
$callback($key, $value, $this);
}
public function every($callback) {
foreach ($this->array as $key => $value ) {
if(!$callback ( $key, $value, $this )) {
return false;
}
}
return true;
}
public function some($callback) {
$flag = false;
foreach ($this->array as $key => $value)
{
if ($callback($key, $value, $this))
$flag = true;
}
return $flag;
}
public function getIterator() {
return new ArrayIterator($this);
}
public function map($callback) {
foreach ($this->array as $key => $value )
$callback ( $key, $value, $this );
return $this->array;
}
public function offsetSet($offset, $value) {
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->container[$offset]);
}
public function offsetUnset($offset) {
unset($this->container[$offset]);
}
public function offsetGet($offset) {
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}
$array = array('_0' => 0);
$array = new ArrayHelper($array);
$func = function ($key, $value, ArrayHelperInterface $array) {
static $i;
$i++;
$c = count($array);
if (is_string($key) && $c < $value) {
unset($array[$key]);
return true;
} else {
$array['_'.$i] = --$c;
return false;
}
};
$array->each($func);
var_dump(iterator_to_array($array));
echo '<br>';
$array->some($func);
var_dump(iterator_to_array($array));
echo '<br>';
?>
При первом вызове
$array->each($func);данные отдаются верно, но при втором вызове
var_dump(iterator_to_array($array));
$array->some($func);данные отдаются по старому array который равен = array('_0' => 0), а не по обработанному array который после $array->each($func); должен равняться = array('_0' =>0, '_1' =>0).
var_dump(iterator_to_array($array));
Подскажите пожалуйста как написать код так что бы на выходе получать данные по уже обработанному масиву.
В результате должно отдавать array(4) {'_0' =>int(0), '_1' =>int(0), '_2' =>int(1),'_3' =>int(2)}