diff --git a/www/admin/class_test.array.php b/www/admin/class_test.array.php
index faa3677b..d6f31290 100644
--- a/www/admin/class_test.array.php
+++ b/www/admin/class_test.array.php
@@ -149,6 +149,38 @@ function rec(string $pre, string $cur, array $node = [])
return $node;
}
+$data = [
+ 'image' => 'foo',
+ 'element' => 'w-1',
+ 'rotate' => 360,
+ 'html' => [
+ 'image' => 'bar',
+ 'result_image' => 'baz',
+ 'rule' => 'wrong'
+ ],
+ [
+ 'image' => 'large'
+ ],
+ [
+ 'nothing' => 'wrong'
+ ],
+ 'nest' => [
+ 'nust' => [
+ 'nist' => [
+ 'foo' => 'bar',
+ 'image' => 'long, long'
+ ]
+ ]
+ ],
+ 's' => [
+ 'image' => 'path?'
+ ],
+];
+
+$search = ['image', 'result_image', 'nothing', 'EMPTY'];
+$result = ArrayHandler::arraySearchKey($data, $search);
+print "ARRAYSEARCHKEY: Search: " . DgS::printAr($search) . ", Found: " . DgS::printAr($result) . "
";
+
// $test = [
// 'A' => [
// 'B' => [],
diff --git a/www/composer.lock b/www/composer.lock
index 886af710..3ce08e51 100644
--- a/www/composer.lock
+++ b/www/composer.lock
@@ -12,7 +12,7 @@
"dist": {
"type": "path",
"url": "/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All",
- "reference": "14a5250cd7dc019107a346a4000b9e419047d55e"
+ "reference": "6bb957fcb3b4246ce5bf3817687ea211d3c7c7ab"
},
"require": {
"php": ">=8.1"
diff --git a/www/vendor/composer/installed.json b/www/vendor/composer/installed.json
index 52602085..69f258e0 100644
--- a/www/vendor/composer/installed.json
+++ b/www/vendor/composer/installed.json
@@ -7,7 +7,7 @@
"dist": {
"type": "path",
"url": "/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All",
- "reference": "14a5250cd7dc019107a346a4000b9e419047d55e"
+ "reference": "6bb957fcb3b4246ce5bf3817687ea211d3c7c7ab"
},
"require": {
"php": ">=8.1"
diff --git a/www/vendor/composer/installed.php b/www/vendor/composer/installed.php
index a5be82f3..902cf32f 100644
--- a/www/vendor/composer/installed.php
+++ b/www/vendor/composer/installed.php
@@ -13,7 +13,7 @@
'egrajp/corelibs-composer-all' => array(
'pretty_version' => 'dev-development',
'version' => 'dev-development',
- 'reference' => '14a5250cd7dc019107a346a4000b9e419047d55e',
+ 'reference' => '6bb957fcb3b4246ce5bf3817687ea211d3c7c7ab',
'type' => 'library',
'install_path' => __DIR__ . '/../egrajp/corelibs-composer-all',
'aliases' => array(),
diff --git a/www/vendor/egrajp/corelibs-composer-all/publish/last.published b/www/vendor/egrajp/corelibs-composer-all/publish/last.published
index fbb9ea12..308c0cb5 100644
--- a/www/vendor/egrajp/corelibs-composer-all/publish/last.published
+++ b/www/vendor/egrajp/corelibs-composer-all/publish/last.published
@@ -1 +1 @@
-8.2.0
+8.2.2
diff --git a/www/vendor/egrajp/corelibs-composer-all/src/Combined/ArrayHandler.php b/www/vendor/egrajp/corelibs-composer-all/src/Combined/ArrayHandler.php
index 8029eb0d..8619f348 100644
--- a/www/vendor/egrajp/corelibs-composer-all/src/Combined/ArrayHandler.php
+++ b/www/vendor/egrajp/corelibs-composer-all/src/Combined/ArrayHandler.php
@@ -177,6 +177,63 @@ class ArrayHandler
return false;
}
+ /**
+ * search for one or many keys in array and return matching values
+ * If flat is set to true, return flat array with found values only
+ * If prefix is turned on each found group will be prefixed with the
+ * search key
+ *
+ * @param array $array array to search in
+ * @param array $needles keys to find in array
+ * @param bool $flat [false] Turn on flat output
+ * @param bool $prefix [false] Prefix found with needle key
+ * @return array Found values
+ */
+ public static function arraySearchKey(
+ array $array,
+ array $needles,
+ bool $flat = false,
+ bool $prefix = false
+ ): array {
+ $iterator = new \RecursiveArrayIterator($array);
+ $recursive = new \RecursiveIteratorIterator(
+ $iterator,
+ \RecursiveIteratorIterator::SELF_FIRST
+ );
+ $hit_list = [];
+ if ($prefix === true) {
+ $hit_list = array_fill_keys($needles, []);
+ }
+ $key_path = [];
+ $prev_depth = 0;
+ foreach ($recursive as $key => $value) {
+ if ($prev_depth > $recursive->getDepth()) {
+ $key_path = [];
+ }
+ $prev_depth = $recursive->getDepth();
+ if ($flat === false) {
+ $key_path[$recursive->getDepth()] = $key;
+ }
+ if (in_array($key, $needles, true)) {
+ ksort($key_path);
+ if ($flat === true) {
+ $hit = $value;
+ } else {
+ $hit = [
+ 'value' => $value,
+ 'path' => $key_path
+ ];
+ }
+ if ($prefix === true) {
+ $hit_list[$key][] = $hit;
+ } else {
+ $hit_list[] = $hit;
+ }
+ }
+ }
+ return $hit_list;
+ }
+
/**
* correctly recursive merges as an array as array_merge_recursive
* just glues things together
diff --git a/www/vendor/egrajp/corelibs-composer-all/test/phpunit/Combined/CoreLibsCombinedArrayHandlerTest.php b/www/vendor/egrajp/corelibs-composer-all/test/phpunit/Combined/CoreLibsCombinedArrayHandlerTest.php
index 0bc60dda..2965010a 100644
--- a/www/vendor/egrajp/corelibs-composer-all/test/phpunit/Combined/CoreLibsCombinedArrayHandlerTest.php
+++ b/www/vendor/egrajp/corelibs-composer-all/test/phpunit/Combined/CoreLibsCombinedArrayHandlerTest.php
@@ -31,6 +31,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
4,
'b',
'c' => 'test',
+ 'single' => 'single',
'same' => 'same',
'deep' => [
'sub' => [
@@ -288,6 +289,188 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
];
}
+ /**
+ * Undocumented function
+ *
+ * @return array
+ */
+ public function arraySearchKeyProvider(): array
+ {
+ /*
+ 0: search in array
+ 1: search keys
+ 2: flat flag
+ 3: prefix flag
+ 4: expected array
+ */
+ return [
+ // single
+ 'find single, standard' => [
+ 0 => self::$array,
+ 1 => ['single'],
+ 2 => null,
+ 3 => null,
+ 4 => [
+ 0 => [
+ 'value' => 'single',
+ 'path' => ['single'],
+ ],
+ ],
+ ],
+ 'find single, prefix' => [
+ 0 => self::$array,
+ 1 => ['single'],
+ 2 => null,
+ 3 => true,
+ 4 => [
+ 'single' => [
+ 0 => [
+ 'value' => 'single',
+ 'path' => ['single'],
+ ],
+ ],
+ ],
+ ],
+ 'find single, flat' => [
+ 0 => self::$array,
+ 1 => ['single'],
+ 2 => true,
+ 3 => null,
+ 4 => [
+ 'single',
+ ],
+ ],
+ 'find single, flat, prefix' => [
+ 0 => self::$array,
+ 1 => ['single'],
+ 2 => true,
+ 3 => true,
+ 4 => [
+ 'single' => [
+ 'single',
+ ],
+ ],
+ ],
+ // not found
+ 'not found, standard' => [
+ 0 => self::$array,
+ 1 => ['NOT FOUND'],
+ 2 => null,
+ 3 => null,
+ 4 => [],
+ ],
+ 'not found, standard, prefix' => [
+ 0 => self::$array,
+ 1 => ['NOT FOUND'],
+ 2 => null,
+ 3 => true,
+ 4 => [
+ 'NOT FOUND' => [],
+ ],
+ ],
+ 'not found, flat' => [
+ 0 => self::$array,
+ 1 => ['NOT FOUND'],
+ 2 => true,
+ 3 => null,
+ 4 => [],
+ ],
+ 'not found, flat, prefix' => [
+ 0 => self::$array,
+ 1 => ['NOT FOUND'],
+ 2 => true,
+ 3 => true,
+ 4 => [
+ 'NOT FOUND' => [],
+ ],
+ ],
+ // multi
+ 'multiple found, standard' => [
+ 0 => self::$array,
+ 1 => ['same'],
+ 2 => null,
+ 3 => null,
+ 4 => [
+ [
+ 'value' => 'same',
+ 'path' => ['a', 'same', ],
+ ],
+ [
+ 'value' => 'same',
+ 'path' => ['same', ],
+ ],
+ [
+ 'value' => 'same',
+ 'path' => ['deep', 'sub', 'same', ],
+ ],
+ ]
+ ],
+ 'multiple found, flat' => [
+ 0 => self::$array,
+ 1 => ['same'],
+ 2 => true,
+ 3 => null,
+ 4 => ['same', 'same', 'same', ],
+ ],
+ // search with multiple
+ 'search multiple, standard' => [
+ 0 => self::$array,
+ 1 => ['single', 'nested'],
+ 2 => null,
+ 3 => null,
+ 4 => [
+ [
+ 'value' => 'single',
+ 'path' => ['single'],
+ ],
+ [
+ 'value' => 'bar',
+ 'path' => ['deep', 'sub', 'nested', ],
+ ],
+ ],
+ ],
+ 'search multiple, prefix' => [
+ 0 => self::$array,
+ 1 => ['single', 'nested'],
+ 2 => null,
+ 3 => true,
+ 4 => [
+ 'single' => [
+ [
+ 'value' => 'single',
+ 'path' => ['single'],
+ ],
+ ],
+ 'nested' => [
+ [
+ 'value' => 'bar',
+ 'path' => ['deep', 'sub', 'nested', ],
+ ],
+ ],
+ ],
+ ],
+ 'search multiple, flat' => [
+ 0 => self::$array,
+ 1 => ['single', 'nested'],
+ 2 => true,
+ 3 => null,
+ 4 => [
+ 'single', 'bar',
+ ],
+ ],
+ 'search multiple, flat, prefix' => [
+ 0 => self::$array,
+ 1 => ['single', 'nested'],
+ 2 => true,
+ 3 => true,
+ 4 => [
+ 'single' => ['single', ],
+ 'nested' => ['bar', ],
+ ],
+ ],
+ ];
+ }
+
/**
* provides array listing for the merge test
*
@@ -691,6 +874,44 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
+ /**
+ * Undocumented function
+ *
+ * @covers::arraySearchKey
+ * @dataProvider arraySearchKeyProvider
+ * @testdox arraySearchKey Search array with keys and flat: $flat, prefix: $prefix [$_dataName]
+ *
+ * @param array $input
+ * @param array $needles
+ * @param bool|null $flat
+ * @param bool|null $prefix
+ * @param array $expected
+ * @return void
+ */
+ public function testArraySearchKey(
+ array $input,
+ array $needles,
+ ?bool $flat,
+ ?bool $prefix,
+ array $expected
+ ): void {
+ if ($flat === null && $prefix === null) {
+ $result = \CoreLibs\Combined\ArrayHandler::arraySearchKey($input, $needles);
+ } elseif ($flat === null) {
+ $result = \CoreLibs\Combined\ArrayHandler::arraySearchKey($input, $needles, prefix: $prefix);
+ } elseif ($prefix === null) {
+ $result = \CoreLibs\Combined\ArrayHandler::arraySearchKey($input, $needles, flat: $flat);
+ } else {
+ $result = \CoreLibs\Combined\ArrayHandler::arraySearchKey($input, $needles, $flat, $prefix);
+ }
+ // print "E: " . print_r($expected, true) . "\n";
+ // print "R: " . print_r($result, true) . "\n";
+ $this->assertEquals(
+ $expected,
+ $result
+ );
+ }
+
/**
* Undocumented function
*