在PHP中从数组键创建新变量

60

假设我有一个数组,像这样:

$foo = array('first' =>  '1st',
             'second' => '2nd',
             'third' =>  '3rd');

我该如何从数组中获取键并将它们变成自己的变量?例如,数组$foo将变为:

$first = '1st';
$second = '2nd';
$third = '3rd';

我之所以提出这个问题,是因为我正在创建一个MVC框架来帮助我的面向对象编程,我希望用户可以通过将变量传递给View加载函数,从而在模板中使用变量,而不必知道数组的名称。

例如:

$array = array('title' =>  'My blog!' [...]);
$this->load->view('view.php', $array);

view.php:

echo $title;

输出:

我的博客!


注:示例来自CodeIgniter。 - Ravinder Payal
1
这并不是与问题完全相关的内容。在其他一些情况下,如果您有相同顺序的较小值数组,您也可以通过list()进行赋值,这更加友好于IDE。 $info = array('coffee', 'brown', 'caffeine'); list($drink, $color, $power) = $info; - user4494077
@mickmackusa 我从来没有想过要单独创建每个变量($var = $row['var'])。我只是这样做了(多年来)。我发现唯一的限制是在字符串中输出它们有点困难... echo "The var is " . $row['var'];echo "The var is $var"; - jpgerb
@jpgerb 嗯,多年后,我不再同意我早期的观点。使用extract()是有正确的时间和地点的。我正在删除我的评论。话虽如此,一些IDE可能会难以识别由extract()生成的变量,并对其认为是“未声明的变量”给出错误的标志。自制MVC技术($this->load->view(...)并不是一个罕见的方法(正如Ravinder所说,这正是CodeIgniter所做的)。这只意味着所有变量都需要在视图文件的顶部进行“文档化”。 - mickmackusa
5个回答

143

27

你可以这样做:

foreach($foo as $k => $v) {
  $$k = $v;
}

8

一个简单的方法是使用可变变量:

foreach($foo as $key => $value) {
   $$key = $value;
}

echo $first; // '1st'

请注意,这通常是不鼓励的。最好修改您的模板系统,以允许在模板内部对变量进行作用域限定。否则,您可能会遇到冲突问题,需要测试它们是否存在等等。

3
在PHP 7.1中,您可以使用list()和它的简写从数组键创建新变量。
$foo = array('first' =>  '1st',
             'second' => '2nd',
             'third' =>  '3rd');
list('first' => $first, 'second' => $second, 'third' => $third) = $foo;
// $first = '1st'

// or use shorthand
['first' => $first, 'second' => $second, 'third' => $third] = $foo;

这使你能够更好地控制从数组中提取变量。例如,你可以仅提取“first”和“second”,而跳过其他内容。

1

这实际上是对我的问题的回答,但由于它被标记为重复,我被建议在此处发布我的答案。(我没有在元中发布的特权。)

当您在数据库中拥有一个具有许多列的表时,为每个列创建一个变量可能会很麻烦。伟大的事情是,您可以自动创建变量!

此方法使用数据库表中列的标题/名称作为变量名,并将所选行的内容作为变量值。

当您仅从表中选择一行时,此方法非常适用。以下是我的代码及注释:

$query = "SELECT * FROM mdlm WHERE mdlmnr = $id";  // Select only *one* row, the column mdlmnr is a unique key
$resultat = $conn->query($query); //Get the result (the connection is established earlier)

while ($col = $resultat->fetch_field()) { //fetch information about the columns
    $kolonnetittel = $col->name; //Set the variable as the name of the column
    echo $kolonnetittel . "<br>"; //Show all the column names/variables
}

$innhold = $resultat->fetch_assoc(); // get the content of the selected row as an array (not a multidimensional array!) 
extract($innhold, EXTR_PREFIX_SAME, "wddx"); // Extract the array

由于我不是专业人士,代码可能不是最好的,但对我来说它有效 :-) 当变量列表出现在我的网页上时,我将其复制到Excel中,并使用连接函数来生成具有指定类的php/html/css代码:每个变量都有一个段落。然后我将此代码复制回我的网页代码中,并移动每个部分。完成之前,我注释掉了这一行:

//echo $kolonnetittel . "<br>"; 

有用的链接:

我希望这个“教程”能帮助其他人!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接