From 19a45c856ea7d59e076a623dca4a2c196e2330df Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Mon, 24 May 2021 23:30:11 +0200 Subject: [PATCH] updates Dataset::resolve to generate a matrix of values from multiple datasets Took 42 seconds --- src/Datasets.php | 77 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 58 insertions(+), 19 deletions(-) diff --git a/src/Datasets.php b/src/Datasets.php index 8eff980c..424e7c2e 100644 --- a/src/Datasets.php +++ b/src/Datasets.php @@ -51,37 +51,61 @@ final class Datasets /** * Resolves the current dataset to an array value. * - * @param Traversable|Closure|iterable|string|null $data + * @param array|string> $datasets * * @return array */ - public static function resolve(string $description, $data): array + public static function resolve(string $description, array $datasets): array { /* @phpstan-ignore-next-line */ - if (is_null($data) || empty($data)) { + if (empty($datasets)) { return [$description => []]; } - if (is_string($data)) { - $data = self::get($data); + $processedDatasets = []; + + foreach ($datasets as $index => $data) { + $processedDataset = []; + + if (is_string($data)) { + $datasets[$index] = self::get($data); + } + + if (is_callable($datasets[$index])) { + $datasets[$index] = call_user_func($datasets[$index]); + } + + if ($datasets[$index] instanceof Traversable) { + $datasets[$index] = iterator_to_array($datasets[$index]); + } + + foreach ($datasets[$index] as $key => $values) { + $values = is_array($values) ? $values : [$values]; + $processedDataset[] = [ + 'label' => self::getDataSetDescription($key, $values), + 'values' => $values, + ]; + } + + $processedDatasets[] = $processedDataset; } - if (is_callable($data)) { - $data = call_user_func($data); - } - - if ($data instanceof Traversable) { - $data = iterator_to_array($data); - } + $datasetCombinations = self::getDataSetsCombinations($processedDatasets); $dataSetDescriptions = []; - $dataSetValues = []; + $dataSetValues = []; - foreach ($data as $key => $values) { - $values = is_array($values) ? $values : [$values]; + foreach ($datasetCombinations as $datasets){ + $partialDescriptions = []; + $values = []; - $dataSetDescriptions[] = $description . self::getDataSetDescription($key, $values); - $dataSetValues[] = $values; + foreach ($datasets as $dataset_data){ + $partialDescriptions[] = $dataset_data['label']; + $values = array_merge($values, $dataset_data['values']); + } + + $dataSetDescriptions[] = $description." with ".implode(" / ", $partialDescriptions); + $dataSetValues[] = $values; } foreach (array_count_values($dataSetDescriptions) as $descriptionToCheck => $count) { @@ -103,6 +127,21 @@ final class Datasets return $namedData; } + private static function getDataSetsCombinations($combinations): array + { + $result = [[]]; + foreach ($combinations as $index => $values) { + $tmp = []; + foreach ($result as $resultItem) { + foreach ($values as $value) { + $tmp[] = array_merge($resultItem, [$index => $value]); + } + } + $result = $tmp; + } + return $result; + } + /** * @param int|string $key * @param array $data @@ -112,9 +151,9 @@ final class Datasets $exporter = new Exporter(); if (is_int($key)) { - return \sprintf(' with (%s)', $exporter->shortenedRecursiveExport($data)); + return \sprintf('(%s)', $exporter->shortenedRecursiveExport($data)); } - return \sprintf(' with data set "%s"', $key); + return \sprintf('data set "%s"', $key); } }