Переменные переменные плохая практика для использования?

Я только что прочитал пост , это плохая практика использовать переменные переменные в 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',
)

Затем (при условии, что вы сохраняете вывод как переменную вместо печати), всякий раз, когда вы хотите повторно получить доступ к этим данным, вы можете чисто использовать базовый цикл.

Другие вопросы по тегам