You can use a recursive approach. The function below will generate combinations of any specified length from any array.
function combine($source, $max_len = 3, $key_part = '') { $result = []; foreach ($source as $value) { if (strlen($key_part.$value) >= $max_len) { $result[] = substr($key_part.$value, 0, $max_len); } else { $result = array_merge($result, combine($source, $max_len, $key_part.$value)); } } return $result; }
Using
$array = array('a', 'b', 'c', 'd'); $keys = combine($array, 3); echo '<pre>'.print_r($keys, 1).'</pre>'; $array = array('a', 'b'); $keys = combine($array, 6); echo '<pre>'.print_r($keys, 1).'</pre>';
UPD: Added $ trim argument - you can specify characters in it, which should not be at the beginning or end of the key
function combine($source, $max_len = 3, $trim = '', $key_part = '') { $result = []; foreach ($source as $value) { if (strlen($key_part.$value) >= $max_len) { if (!strlen($trim) || $key_part.$value == trim($key_part.$value, $trim)) { $result[] = substr($key_part.$value, 0, $max_len); } } else { $result = array_merge($result, combine($source, $max_len, $trim, $key_part.$value)); } } return $result; } $array = array('a', 'b', 'c', '-', '+'); $keys = combine($array, 3, '-+'); echo '<pre>'.print_r($keys, 1).'</pre>';