Средствами PHP и с использованием ООП (php version > 5.3) создать реализацию следующего интерфейса:
https://gist.github.com/lazycommit/5626511
Приветствуется php>5.4.1
В результате реализации интерфейса должно быть возможным корректное использование следующего кода.
https://gist.github.com/lazycommit/5626797
В результати некоторых мысленных потуг у меня получился такой код:
<?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 $container;
public function __construct($array) {
$this->array = $array;
}
public function count() {
return count($this->array);
}
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->array);
}
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->array[] = $value;
} else {
$this->array[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->array[$offset]);
}
public function offsetUnset($offset) {
unset($this->array[$offset]);
}
public function offsetGet($offset) {
return isset($this->array[$offset]) ? $this->array[$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(2) {
'_0' =>
/'_1' =>
int(0)
}
*/
$array->some($func);
var_dump(iterator_to_array($array));
echo "<br>";
/*
array(4) {
'_0' =>
int(0)
'_1' =>
int(0)
'_2' =>
int(1)
'_3' =>
int(2)
}
*/
$array->every($func);
var_dump(iterator_to_array($array));
echo "<br>";
/*
array(5) {
'_0' =>
int(0)
'_1' =>
int(0)
'_2' =>
int(1)
'_3' =>
int(2)
'_4' =>
int(3)
}
*/
?>
Код работает корректно и даже отдает то что мне нужно :) но поскольку программист я еще только начинаю, я прекрасно понимаю что профессионалы данный код вполне могли написать более корректно и красиво. Поэтому прошу Вас хоть одним глазком просмотреть этот код и возможно подсказать что именно в нем стоит понять.
Заранее спасибо.