У этой функции разные результаты.
1) Если вы передадите в функцию несколько строк, она получит массив строк, например:
test('a', 'series of', 'strings go here');
//vardump result
array (size=3)
0 => string 'a' (length=1)
1 => string 'series of' (length=9)
2 => string 'strings go here' (length=15)
2) Если вы передадите массив в функцию, он получит массив массивов. Оператор splat добавит первую запись, которую вы передадите функции, в первый индекс массива, второй параметр добавит во второй индекс и так далее. поэтому независимо от того, что вы передадите в функцию (массив или строку), она пойдет до нулевого индекса. но проблема в том, что если вы передадите массив, он сгенерирует массив массивов в первом индексе массива:
test([ 'a', 'series of', 'strings go here' ]);
//vardump result
array (size=1)
0 =>
array (size=3)
0 => string 'a' (length=1)
1 => string 'series of' (length=9)
2 => string 'strings go here' (length=15)
Вывод:
Вы можете решить эту проблему одним из следующих двух способов:
1) поставить 3 точки перед передачей массива в функцию:
test(...[ 'a', 'series of', 'strings go here' ]);
2) Другой способ сделать это - добавить функцию с именем is_multi_array (), чтобы проверить, является ли переменная, переданная в функцию, многомерной. После этого вы можете просто получить первый элемент массива и поместить его в строковую переменную:
function is_multi_array( $arr ) {
rsort( $arr );
return (isset( $arr[0] ) && is_array( $arr[0] ));
}
function test(...$strings)
{
if(is_multi_array($strings)){
$strings = $strings[0];
}
//do the rest
}
Таким образом, вы можете использовать эту функцию двумя способами:
test('a', 'series of', 'strings go here');
test([ 'a', 'series of', 'strings go here' ]);