Version 1
[yaffs-website] / web / core / tests / Drupal / Tests / Traits / Core / GeneratePermutationsTrait.php
diff --git a/web/core/tests/Drupal/Tests/Traits/Core/GeneratePermutationsTrait.php b/web/core/tests/Drupal/Tests/Traits/Core/GeneratePermutationsTrait.php
new file mode 100644 (file)
index 0000000..6e222cb
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+
+namespace Drupal\Tests\Traits\Core;
+
+/**
+ * Adds ability to convert a list of parameters into a stack of permutations.
+ */
+trait GeneratePermutationsTrait {
+
+  /**
+   * Converts a list of possible parameters into a stack of permutations.
+   *
+   * Takes a list of parameters containing possible values, and converts all of
+   * them into a list of items containing every possible permutation.
+   *
+   * Example:
+   * @code
+   * $parameters = [
+   *   'one' => [0, 1],
+   *   'two' => [2, 3],
+   * ];
+   * $permutations = $this->generatePermutations($parameters);
+   * // Result:
+   * $permutations == [
+   *   ['one' => 0, 'two' => 2],
+   *   ['one' => 1, 'two' => 2],
+   *   ['one' => 0, 'two' => 3],
+   *   ['one' => 1, 'two' => 3],
+   * ]
+   * @endcode
+   *
+   * @param array $parameters
+   *   An associative array of parameters, keyed by parameter name, and whose
+   *   values are arrays of parameter values.
+   *
+   * @return array[]
+   *   A list of permutations, which is an array of arrays. Each inner array
+   *   contains the full list of parameters that have been passed, but with a
+   *   single value only.
+   */
+  public static function generatePermutations(array $parameters) {
+    $all_permutations = [[]];
+    foreach ($parameters as $parameter => $values) {
+      $new_permutations = [];
+      // Iterate over all values of the parameter.
+      foreach ($values as $value) {
+        // Iterate over all existing permutations.
+        foreach ($all_permutations as $permutation) {
+          // Add the new parameter value to existing permutations.
+          $new_permutations[] = $permutation + [$parameter => $value];
+        }
+      }
+      // Replace the old permutations with the new permutations.
+      $all_permutations = $new_permutations;
+    }
+    return $all_permutations;
+  }
+
+}