Add `intersect()` and `intersectKeys()`.
This commit is contained in:
parent
81be8bd83a
commit
11ba227653
|
@ -160,6 +160,8 @@ const zend_function_entry collection_methods[] = {
|
||||||
PHP_ME(Collection, indexOfLast, predicate_arginfo, ZEND_ACC_PUBLIC)
|
PHP_ME(Collection, indexOfLast, predicate_arginfo, ZEND_ACC_PUBLIC)
|
||||||
PHP_ME(Collection, init, elements_arginfo, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
PHP_ME(Collection, init, elements_arginfo, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
|
||||||
PHP_ME(Collection, intersect, other_arginfo, ZEND_ACC_PUBLIC)
|
PHP_ME(Collection, intersect, other_arginfo, ZEND_ACC_PUBLIC)
|
||||||
|
PHP_ME(Collection, intersectKeys, other_arginfo, ZEND_ACC_PUBLIC)
|
||||||
|
PHP_ME(Collection, intersectValues, other_arginfo, ZEND_ACC_PUBLIC)
|
||||||
PHP_ME(Collection, isEmpty, NULL, ZEND_ACC_PUBLIC)
|
PHP_ME(Collection, isEmpty, NULL, ZEND_ACC_PUBLIC)
|
||||||
PHP_ME(Collection, isNotEmpty, NULL, ZEND_ACC_PUBLIC)
|
PHP_ME(Collection, isNotEmpty, NULL, ZEND_ACC_PUBLIC)
|
||||||
PHP_ME(Collection, keys, NULL, ZEND_ACC_PUBLIC)
|
PHP_ME(Collection, keys, NULL, ZEND_ACC_PUBLIC)
|
||||||
|
|
|
@ -1780,6 +1780,73 @@ PHP_METHOD(Collection, init)
|
||||||
}
|
}
|
||||||
|
|
||||||
PHP_METHOD(Collection, intersect)
|
PHP_METHOD(Collection, intersect)
|
||||||
|
{
|
||||||
|
zval* elements;
|
||||||
|
ZEND_PARSE_PARAMETERS_START(1, 1)
|
||||||
|
Z_PARAM_ZVAL(elements)
|
||||||
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
ELEMENTS_VALIDATE(elements, ERR_BAD_ARGUMENT_TYPE, return);
|
||||||
|
zend_array* current = COLLECTION_FETCH_CURRENT();
|
||||||
|
ARRAY_NEW(intersected, 8);
|
||||||
|
equal_check_func_t eql = NULL;
|
||||||
|
ZEND_HASH_FOREACH_BUCKET(elements_arr, Bucket* bucket)
|
||||||
|
if (UNEXPECTED(eql == NULL))
|
||||||
|
{
|
||||||
|
eql = equal_check_func_init(&bucket->val);
|
||||||
|
}
|
||||||
|
if (bucket->key)
|
||||||
|
{
|
||||||
|
zval* result = zend_hash_find(current, bucket->key);
|
||||||
|
if (result && eql(&bucket->val, result))
|
||||||
|
{
|
||||||
|
zend_hash_add(intersected, bucket->key, result);
|
||||||
|
Z_TRY_ADDREF_P(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
zval* result = zend_hash_index_find(current, bucket->h);
|
||||||
|
if (result && eql(&bucket->val, result))
|
||||||
|
{
|
||||||
|
zend_hash_index_add(intersected, bucket->h, result);
|
||||||
|
Z_TRY_ADDREF_P(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ZEND_HASH_FOREACH_END();
|
||||||
|
RETVAL_NEW_COLLECTION(intersected);
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_METHOD(Collection, intersectKeys)
|
||||||
|
{
|
||||||
|
zval* elements;
|
||||||
|
ZEND_PARSE_PARAMETERS_START(1, 1)
|
||||||
|
Z_PARAM_ZVAL(elements)
|
||||||
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
ELEMENTS_VALIDATE(elements, ERR_BAD_ARGUMENT_TYPE, return);
|
||||||
|
zend_array* current = COLLECTION_FETCH_CURRENT();
|
||||||
|
ARRAY_NEW(intersected, 8);
|
||||||
|
ZEND_HASH_FOREACH_BUCKET(current, Bucket* bucket)
|
||||||
|
if (bucket->key)
|
||||||
|
{
|
||||||
|
if (zend_hash_exists(elements_arr, bucket->key))
|
||||||
|
{
|
||||||
|
zend_hash_add(intersected, bucket->key, &bucket->val);
|
||||||
|
Z_TRY_ADDREF(bucket->val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (zend_hash_index_exists(elements_arr, bucket->h))
|
||||||
|
{
|
||||||
|
zend_hash_index_add(intersected, bucket->h, &bucket->val);
|
||||||
|
Z_TRY_ADDREF(bucket->val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ZEND_HASH_FOREACH_END();
|
||||||
|
RETVAL_NEW_COLLECTION(intersected);
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_METHOD(Collection, intersectValues)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,8 @@ PHP_METHOD(Collection, indexOfFirst);
|
||||||
PHP_METHOD(Collection, indexOfLast);
|
PHP_METHOD(Collection, indexOfLast);
|
||||||
PHP_METHOD(Collection, init);
|
PHP_METHOD(Collection, init);
|
||||||
PHP_METHOD(Collection, intersect);
|
PHP_METHOD(Collection, intersect);
|
||||||
|
PHP_METHOD(Collection, intersectKeys);
|
||||||
|
PHP_METHOD(Collection, intersectValues);
|
||||||
PHP_METHOD(Collection, isEmpty);
|
PHP_METHOD(Collection, isEmpty);
|
||||||
PHP_METHOD(Collection, isNotEmpty);
|
PHP_METHOD(Collection, isNotEmpty);
|
||||||
PHP_METHOD(Collection, keys);
|
PHP_METHOD(Collection, keys);
|
||||||
|
|
|
@ -373,13 +373,34 @@ class Collection implements ArrayAccess, Countable
|
||||||
static function init($elements) {}
|
static function init($elements) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a collection containing all elements that are contained by both this collection and the
|
* Returns a collection containing all key-value pairs that are contained by both this collection
|
||||||
* specified collection.
|
* and the specified collection.
|
||||||
*
|
*
|
||||||
* @param array|Collection $other
|
* @param array|Collection $other
|
||||||
|
* @return Collection
|
||||||
*/
|
*/
|
||||||
function intersect($other) {}
|
function intersect($other) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a collection containing all elements with keys contained by both this collection
|
||||||
|
* and the specified collection. Values are that of the original collection.
|
||||||
|
*
|
||||||
|
* @param array|Collection $other
|
||||||
|
* @return Collection
|
||||||
|
*/
|
||||||
|
function intersectKeys($other) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a collection containing all elements with values contained by both this collection
|
||||||
|
* and the specified collection. Keys are that of the original collection.
|
||||||
|
*
|
||||||
|
* Duplicate values will be removed.
|
||||||
|
*
|
||||||
|
* @param array|Collection $other
|
||||||
|
* @return Collection
|
||||||
|
*/
|
||||||
|
function intersectValues($other) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the collection is empty.
|
* Returns true if the collection is empty.
|
||||||
*
|
*
|
||||||
|
@ -389,6 +410,8 @@ class Collection implements ArrayAccess, Countable
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the collection is not empty.
|
* Returns true if the collection is not empty.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
*/
|
*/
|
||||||
function isNotEmpty() {}
|
function isNotEmpty() {}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
--TEST--
|
||||||
|
Test Collection::intersect() and Collection::intersectKeys().
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$array = [
|
||||||
|
'a' => 'b',
|
||||||
|
'c' => 'd',
|
||||||
|
'e' => 'f'
|
||||||
|
];
|
||||||
|
$array1 = [
|
||||||
|
'a' => 'c',
|
||||||
|
'b' => strval(12),
|
||||||
|
'c' => 'd',
|
||||||
|
'g' => 'h'
|
||||||
|
];
|
||||||
|
$collection = Collection::init($array);
|
||||||
|
$intersected = array_intersect_assoc($array, $array1);
|
||||||
|
if ($collection->intersect($array1)->toArray() != $intersected) {
|
||||||
|
echo 'Collection::intersect() failed.', PHP_EOL;
|
||||||
|
}
|
||||||
|
$collection1 = Collection::init($array1);
|
||||||
|
$intersected = array_intersect_key($array, $array1);
|
||||||
|
if ($collection->intersectKeys($collection1)->toArray() != $intersected) {
|
||||||
|
echo 'Collection::intersectKeys() failed.', PHP_EOL;
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
Reference in New Issue