<?php
/**
* Behaves like a PHP array (unstructured)
*/
class Bag implements IteratorAggregate, ArrayAccess {
private $__data;
// Implementation for ArrayAccess
public function offsetSet($offset, $value)
{
if (is_null($offset)) {
$this->__data[] = value;
} else {
$this->__data[$offset] = $value;
}
}
public function offsetExists($offset)
{
return isset($this->__data[$offset]);
}
public function offsetUnset($offset)
{
unset($this->__data[$offset]);
}
public function offsetGet($offset)
{
return isset($this->__data[$offset]) ? $this->__data[$offset] : null;
}
// Implementation for IteratorAggregate
public function getIterator()
{
return new ArrayIterator($this->__data);
}
public function __construct(array $data) {
$this->data = $data;
}
public function some(Closure $fn) {
return new Bag(array_reduce($this->__data, function ($carry, $x) {
return $fn($x) || $carry;
}, false));
}
public function every(Closure $fn) {
return new Bag(array_reduce($this->__data, function ($carry, $x) {
return $fn($x) && $carry;
}, true));
}
public function reduce(Closure $fn) {
return new Bag(array_reduce($this->__data, $fn));
}
public function map(Closure $fn) {
return new Bag(array_map($fn, $this->__data));
}
public function filter(Closure $fn) {
return new Bag(array_filter($this->__data, $fn));
}
}
$bag = new Bag([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
print_r($bag);
print_r($bag->filter(function ($x) { return !($x % 2); }));
Deprecated: Return type of Bag::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 37
Deprecated: Return type of Bag::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 20
Deprecated: Return type of Bag::offsetGet($offset) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 30
Deprecated: Return type of Bag::offsetSet($offset, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 11
Deprecated: Return type of Bag::offsetUnset($offset) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 25
Deprecated: Creation of dynamic property Bag::$data is deprecated in /in/HdKDV on line 43
Bag Object
(
[__data:Bag:private] =>
[data] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 10
)
)
Fatal error: Uncaught TypeError: array_filter(): Argument #1 ($array) must be of type array, null given in /in/HdKDV:67
Stack trace:
#0 /in/HdKDV(67): array_filter(NULL, Object(Closure))
#1 /in/HdKDV(73): Bag->filter(Object(Closure))
#2 {main}
thrown in /in/HdKDV on line 67
Process exited with code 255.
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
Deprecated: Return type of Bag::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 37
Deprecated: Return type of Bag::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 20
Deprecated: Return type of Bag::offsetGet($offset) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 30
Deprecated: Return type of Bag::offsetSet($offset, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 11
Deprecated: Return type of Bag::offsetUnset($offset) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 25
Deprecated: Creation of dynamic property Bag::$data is deprecated in /in/HdKDV on line 43
Bag Object
(
[__data:Bag:private] =>
[data] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 10
)
)
Fatal error: Uncaught TypeError: array_filter(): Argument #1 ($array) must be of type array, null given in /in/HdKDV:67
Stack trace:
#0 /in/HdKDV(67): array_filter(NULL, Object(Closure))
#1 /in/HdKDV(73): Bag->filter(Object(Closure))
#2 {main}
thrown in /in/HdKDV on line 67
Process exited with code 255.
Output for 8.1.0 - 8.1.28
Deprecated: Return type of Bag::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 37
Deprecated: Return type of Bag::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 20
Deprecated: Return type of Bag::offsetGet($offset) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 30
Deprecated: Return type of Bag::offsetSet($offset, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 11
Deprecated: Return type of Bag::offsetUnset($offset) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/HdKDV on line 25
Bag Object
(
[__data:Bag:private] =>
[data] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 10
)
)
Fatal error: Uncaught TypeError: array_filter(): Argument #1 ($array) must be of type array, null given in /in/HdKDV:67
Stack trace:
#0 /in/HdKDV(67): array_filter(NULL, Object(Closure))
#1 /in/HdKDV(73): Bag->filter(Object(Closure))
#2 {main}
thrown in /in/HdKDV on line 67
Process exited with code 255.
Output for 8.0.0 - 8.0.30
Bag Object
(
[__data:Bag:private] =>
[data] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 10
)
)
Fatal error: Uncaught TypeError: array_filter(): Argument #1 ($array) must be of type array, null given in /in/HdKDV:67
Stack trace:
#0 /in/HdKDV(67): array_filter(NULL, Object(Closure))
#1 /in/HdKDV(73): Bag->filter(Object(Closure))
#2 {main}
thrown in /in/HdKDV on line 67
Process exited with code 255.
Bag Object
(
[__data:Bag:private] =>
[data] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 10
)
)
Warning: array_filter() expects parameter 1 to be array, null given in /in/HdKDV on line 67
Fatal error: Uncaught TypeError: Argument 1 passed to Bag::__construct() must be of the type array, null given, called in /in/HdKDV on line 67 and defined in /in/HdKDV:42
Stack trace:
#0 /in/HdKDV(67): Bag->__construct(NULL)
#1 /in/HdKDV(73): Bag->filter(Object(Closure))
#2 {main}
thrown in /in/HdKDV on line 42
Process exited with code 255.
Bag Object
(
[__data:Bag:private] =>
[data] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 10
)
)
Warning: array_filter() expects parameter 1 to be array, null given in /in/HdKDV on line 67
Catchable fatal error: Argument 1 passed to Bag::__construct() must be of the type array, null given, called in /in/HdKDV on line 67 and defined in /in/HdKDV on line 42
Process exited with code 255.
Output for 5.3.0 - 5.3.29
Parse error: syntax error, unexpected '[', expecting ')' in /in/HdKDV on line 71
Process exited with code 255.
Output for 5.1.0 - 5.1.6, 5.2.0 - 5.2.17
Parse error: syntax error, unexpected T_FUNCTION in /in/HdKDV on line 47
Process exited with code 255.
Output for 5.0.0 - 5.0.5
Parse error: parse error, unexpected T_ARRAY, expecting '&' or T_VARIABLE in /in/HdKDV on line 42
Process exited with code 255.
Output for 4.4.2 - 4.4.9
Parse error: syntax error, unexpected T_STRING, expecting '{' in /in/HdKDV on line 6
Process exited with code 255.