PHP: взорвать массив и использовать каждое значение массива несколько раз
Я хочу добиться следующего:
преобразовать массив:
['A','B','C'];
в строку вроде:
"A is A, B is B, C is C"
Есть ли другой способ, кроме цикла foreach (например, взрыва), чтобы достичь этого?
5 ответов
Если вы не хотите проходить, вы можете использовать функцию array_walk().
Попробуй это:
$input = ['A','B','C'];
function test_alter(&$item, &$key) {
$item = $item.' is '.$item;
}
array_walk($input, 'test_alter');
echo implode(', ', $input);
Выход:
A is A, B is B, C is C
$arr = ['A','B','C'];
function myfunction($arr)
{
return "$arr is $arr";
}
print_r(array_map("myfunction",$arr));
//[0] => A is A [1] => B is B [2] => C is C
Вот моя рекомендация, так как вы привыкли использовать implode в php, я написал вам дублирующую функцию, которая принимает элемент форматирования в вашем разделителе. Куда бы вы ни поместили%x, он будет дублировать ключ массива следующим образом:
echo implodeDuplicate(" is %x, ", $myArray);
при условии, что $myArray был:
$myArray = array(1,2,3,4);
это выведет:
1 is 1, 2 is 2, 3 is 3, 4 is 4,
Вот функция:
function implodeDuplicate($seperator, $array) {
$finalString = "";
for($i = 0; $i < count($array); $i++) {
$trueSep = str_replace("%x", $array[$i], $seperator);
$finalString .= $array[$i] . $trueSep;
}
return $finalString;
}
Надеюсь, это полезно!:)
Использовать ниже путь с array_walk
$arr = ['A','B','C'];
function _print($item2, $key)
{
echo "$item2 is $item2, ";
}
array_walk($arr, '_print');
или, если необходимо сохранить в строке, используйте ниже
$arr = ['A','B','C'];
$str = '';
function _print($item2, $key)
{
global $str;
$str = $str."$item2 is $item2, ";
}
array_walk($arr, '_print');
echo trim($str,',');
Я вижу array_map()
а также array_walk()
решения, но никто не разместил array_reduce()
метод, так что я буду для полноты.
Для небольших массивов (требуется несколько итераций), array_map()
будет выполняться чуть-чуть быстрее (ваши пользователи никогда не заметят разницы).
По мере увеличения размера входного массива array_reduce()
берет на себя инициативу и дистанцируется от array_map()
, Сделайте свои собственные тесты с вашими собственными реальными данными, если вам нужно выполнить микрооптимизацию.
array_reduce()
в массиве из 26 элементов зацикливается 100 раз: https://3v4l.org/1oCXM/perfarray_map()
в массиве из 26 элементов зацикливается 100 раз: https://3v4l.org/WcjMB/perf
Мой следующий метод не нужен implode()
так как array_reduce()
выводит строку, однако для каждой итерации требуется условие, чтобы избежать "чрезмерного склеивания".
Код: ( Демо)
$input=['A','B','C'];
echo array_reduce($input,function($carry,$v){return ($carry?"$carry, ":'')."$v is $v";});
Выход:
A is A, B is B, C is C