gatlingGun shoots holes in your array

Here’s a snippet I created to generate invalid data from a valid key-value array. It’s really handy for testing. Feel free to use it.

  /**
   * Gatling gun takes an array of valid params and returns every
   * combination of invalid data caused by blanking out individual params.
   *
   * Example:
   *
   * $validData = array('firstName' => 'Gatling',
   *                    'lastName' => 'Gun',
   *                    'age' => 12);
   *
   * $ggData = gatlingGun($validData);
   *
   * $ggData = array(
   *     array('firstName' => '',        'lastName' => '',    'age' => ''),
   *     array('firstName' => '',        'lastName' => '',    'age' => 12),
   *     array('firstName' => '',        'lastName' => 'Gun', 'age' => ''),
   *     array('firstName' => '',        'lastName' => 'Gun', 'age' => 12),
   *     array('firstName' => 'Gatling', 'lastName' => '',    'age' => ''),
   *     array('firstName' => 'Gatling', 'lastName' => '',    'age' => 12),
   *     array('firstName' => 'Gatling', 'lastName' => 'Gun', 'age' => '')
   * );
   *
   *
   * @param array $validData
   * @return array
   *
   */
  function gatlingGun($validData)
  {
      $original = $validData;
      $invalidCombinations = array();

      $max = count($original);
      $keys = array_keys($original);
      $combinations = pow(2, $max) - 1;

      for ($i = 0; $i < $combinations; $i++) {
           $tmp = array();
           $j = count($keys) - 1;
           foreach ($keys as $k => $key) {
              $tmp[$key] = (($i & pow(2,$j)) == 0) ? '' : $original[$key];
              $j--;
          }

          $invalidCombinations[] = $tmp;
      }
      return $invalidCombinations;
  }

Just be careful, the number of combinations it comes up with is 2^n - 1. So the number of invalid combinations from an array with 10 key-value pairs will quickly balloon to 1023.

Do drop me a line to let me know if this has been helpful for you.