Add `filterTo()` and `filterNotTo()`
This commit is contained in:
parent
9b08894ae5
commit
d2506ee5c9
|
@ -308,9 +308,9 @@ PHP_METHOD(Collection, associateBy)
|
||||||
|
|
||||||
PHP_METHOD(Collection, associateByTo)
|
PHP_METHOD(Collection, associateByTo)
|
||||||
{
|
{
|
||||||
|
zval* dest;
|
||||||
zend_fcall_info fci;
|
zend_fcall_info fci;
|
||||||
zend_fcall_info_cache fcc;
|
zend_fcall_info_cache fcc;
|
||||||
zval* dest;
|
|
||||||
ZEND_PARSE_PARAMETERS_START(2, 2)
|
ZEND_PARSE_PARAMETERS_START(2, 2)
|
||||||
Z_PARAM_OBJECT_OF_CLASS(dest, collections_collection_ce)
|
Z_PARAM_OBJECT_OF_CLASS(dest, collections_collection_ce)
|
||||||
Z_PARAM_FUNC(fci, fcc)
|
Z_PARAM_FUNC(fci, fcc)
|
||||||
|
@ -635,12 +635,48 @@ PHP_METHOD(Collection, filterNot)
|
||||||
|
|
||||||
PHP_METHOD(Collection, filterNotTo)
|
PHP_METHOD(Collection, filterNotTo)
|
||||||
{
|
{
|
||||||
|
zval* dest;
|
||||||
|
zend_fcall_info fci;
|
||||||
|
zend_fcall_info_cache fcc;
|
||||||
|
ZEND_PARSE_PARAMETERS_START(2, 2)
|
||||||
|
Z_PARAM_OBJECT_OF_CLASS(dest, collections_collection_ce)
|
||||||
|
Z_PARAM_FUNC(fci, fcc)
|
||||||
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
INIT_FCI();
|
||||||
|
zval* current = COLLECTION_FETCH_EX();
|
||||||
|
zend_array* dest_arr = Z_ARRVAL_P(COLLECTION_FETCH(dest));
|
||||||
|
ZEND_HASH_FOREACH_BUCKET(Z_ARRVAL_P(current), Bucket* bucket)
|
||||||
|
CALLBACK_KEYVAL_INVOKE(params, bucket);
|
||||||
|
if (!zend_is_true(&retval))
|
||||||
|
if (bucket->key)
|
||||||
|
zend_hash_add(dest_arr, bucket->key, &bucket->val);
|
||||||
|
else
|
||||||
|
zend_hash_next_index_insert(dest_arr, &bucket->val);
|
||||||
|
ZEND_HASH_FOREACH_END();
|
||||||
|
RETVAL_ZVAL(dest, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
PHP_METHOD(Collection, filterTo)
|
PHP_METHOD(Collection, filterTo)
|
||||||
{
|
{
|
||||||
|
zval* dest;
|
||||||
|
zend_fcall_info fci;
|
||||||
|
zend_fcall_info_cache fcc;
|
||||||
|
ZEND_PARSE_PARAMETERS_START(2, 2)
|
||||||
|
Z_PARAM_OBJECT_OF_CLASS(dest, collections_collection_ce)
|
||||||
|
Z_PARAM_FUNC(fci, fcc)
|
||||||
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
INIT_FCI();
|
||||||
|
zval* current = COLLECTION_FETCH_EX();
|
||||||
|
zend_array* dest_arr = Z_ARRVAL_P(COLLECTION_FETCH(dest));
|
||||||
|
ZEND_HASH_FOREACH_BUCKET(Z_ARRVAL_P(current), Bucket* bucket)
|
||||||
|
CALLBACK_KEYVAL_INVOKE(params, bucket);
|
||||||
|
if (zend_is_true(&retval))
|
||||||
|
if (bucket->key)
|
||||||
|
zend_hash_add(dest_arr, bucket->key, &bucket->val);
|
||||||
|
else
|
||||||
|
zend_hash_next_index_insert(dest_arr, &bucket->val);
|
||||||
|
ZEND_HASH_FOREACH_END();
|
||||||
|
RETVAL_ZVAL(dest, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
PHP_METHOD(Collection, find)
|
PHP_METHOD(Collection, find)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
--TEST--
|
--TEST--
|
||||||
Test Collection::filter() and Collection::filterNot().
|
Test Collection::filter(), Collection::filterNot(), Collection::filterTo(), Collection::filterNotTo().
|
||||||
--FILE--
|
--FILE--
|
||||||
<?php
|
<?php
|
||||||
$array = [1, 3, 4, 5, 8, 10, 13];
|
$array = [1, 3, 4, 5, 8, 10, 13];
|
||||||
|
@ -14,6 +14,13 @@ $collection1 = Collection::init($array)->filterNot($pred_is_odd);
|
||||||
if ($collection->toArray() != array_filter($array, $pred_is_odd))
|
if ($collection->toArray() != array_filter($array, $pred_is_odd))
|
||||||
echo 'Collection::filter() failed.', PHP_EOL;
|
echo 'Collection::filter() failed.', PHP_EOL;
|
||||||
if ($collection1->toArray() != array_filter($array, $pred_is_even))
|
if ($collection1->toArray() != array_filter($array, $pred_is_even))
|
||||||
echo 'Collection::filter() failed.', PHP_EOL;
|
echo 'Collection::filterNot() failed.', PHP_EOL;
|
||||||
|
$dest = Collection::init($array);
|
||||||
|
$collection2 = Collection::init($array)->filterTo($dest, $pred_is_odd);
|
||||||
|
if ($collection2->toArray() != array_merge($array, $collection->toArray()))
|
||||||
|
echo 'Collection::filterTo() failed.', PHP_EOL;
|
||||||
|
$collection3 = Collection::init($array)->filterNotTo($dest, $pred_is_odd);
|
||||||
|
if ($collection3->toArray() != array_merge($array, $collection->toArray(), $collection1->toArray()))
|
||||||
|
echo 'Collection::filterNotTo() failed.', PHP_EOL;
|
||||||
?>
|
?>
|
||||||
--EXPECT--
|
--EXPECT--
|
||||||
|
|
Reference in New Issue