Переменные переменные плохая практика для использования?
Я только что прочитал пост , это плохая практика использовать переменные переменные в php следующим образом? объясняя, почему их плохо использовать с классами, я должен создать динамические переменные для сортировки
например:
$array =
array(
array("Line 1","Line 2","Line 3"),
array("Line 1","Line 2","Line 3"),
array("Line 1","Line 2","Line 3"),
)
$i = 1;
foreach($array as $item){
$string = "Item".$i;
$$string = $item[0]."some code".$item[1]."some code".$item[2]."some code";
}
я знаю, что в каждом вторичном массиве будет только 3 значения массива и будет только 3 массива.
Есть ли способ достичь этого с помощью кода "лучшей практики"? или более простой способ, который я пропустил?
спасибо за ваше время заранее
2 ответа
Это должно сделать это просто отлично:
$newArray = array_map(function (array $item) {
return $item[0]."some code".$item[1]."some code".$item[2]."some code";
}, $array);
var_dump($newArray);
Я не вижу, где отдельные переменные нужны вообще.
Если вы просто непрерывно нумеруйте переменные динамически ($item1
, $item2
и т.д.), вы пытаетесь удерживать динамическое количество элементов. Это именно то, для чего предназначены массивы: $items[0]
, $items[1]
и т.п.
Я, конечно, не стал бы использовать «переменные переменные». Когда-то было время, когда я думал, что они довольно крутые, но вскоре я понял, что это просто неуместные массивы данных. Использование переменных переменных исключает любую возможность использования чрезвычайно мощного родного PHP.
array_
функции. Я рекомендую вам держаться от них подальше, насколько это возможно.
Кроме того, вашей среде IDE будет гораздо труднее отслеживать ваши переменные имена переменных, и вы увидите кучу ложноположительных предупреждений в своей среде IDE о том, что переменные используются без закрытия.
Я бы, вероятно, сопоставил ваш входной массив (например, упомянутый @deceze), но
vsprintf()
это хороший способ избежать объединения строк.
Код: (Демо)
$array = [
["Line 1", "Line 2", "Line 3"],
["Line 4", "Line 5", "Line 6"],
["Line 7", "Line 8", "Line 9"],
];
var_export(
array_map(
fn($row) => vsprintf('%s some code %s some code %s some code', $row),
$array
)
);
Выход:
array (
0 => 'Line 1 some code Line 2 some code Line 3 some code',
1 => 'Line 4 some code Line 5 some code Line 6 some code',
2 => 'Line 7 some code Line 8 some code Line 9 some code',
)
Затем (при условии, что вы сохраняете вывод как переменную вместо печати), всякий раз, когда вы хотите повторно получить доступ к этим данным, вы можете чисто использовать базовый цикл.