使用数组中的值填充PHP list()

时间:2010-04-20 12:15:07

标签: php list arrays

我有一个数组:

$arr = array('foo', 'bar', 'bash', 'monkey', 'badger');

我希望该数组中的元素显示为list()中的变量:

list($foo, $bar, $bash, $monkey, $badger) = $data;

没有实际指定变量,我试过了;

list(implode(",$", $arr)) = $data; and
list(extract($arr)) = $data;

但是他们没有用,我得到了:

Fatal error: Can't use function return value in write context

有没有人知道这是否可行?


更新:更多背景信息:

我从API获取CSV数据,第一行是列名,后面的每一行都是数据。我想构建一个如下所示的关联数组:

$data[0]['colname1'] = 'col1data';
$data[0]['colname2'] = 'col2data';
$data[0]['colname3'] = 'col3data';
$data[1]['colname1'] = 'col1data';
$data[1]['colname2'] = 'col2data';
$data[1]['colname3'] = 'col3data';

然而,在我这样做之前,我想确保我拥有所需的所有列。因此,我使用我需要的列名构建一个数组,运行一些检查以确保CSV确实包含我需要的所有列。一旦完成,代码看起来有点像(在CSV的每一行数据的foreach()上执行):

//$data is an array of data WITHOUT string indexes
list(   $col1,
    $col2,
    $col3,
    ...
    $col14
 ) = $data;

foreach($colNames AS $name)
{
    $newData[$i][$name] = $$name;
}
// Increemnt
$i++;

由于我已经有了一个列名列,我虽然可以节省一些时间在列表函数中使用THAT,而不是显式地放入每个变量名。

数据在其他地方进行清理和消毒。

干杯,

麦克

6 个答案:

答案 0 :(得分:2)

  

我希望该数组中的元素显示为list()中的变量:

我认为你的理解存在问题。 list()不会创建新的列表结构或变量,它只能用于一次分配多个变量:

$arr = array(1, 2, 3);
list($first, $second, $third) = $arr;
// $first = 1, $second = 2, $third = 3

有关详细信息,请参阅http://php.net/list

您可能正在寻找associative array。您可以使用以下代码创建它:

$arr = array('first' => 1, 'second' => 2, 'third' => 3);
// $arr['first'] = 1, …

答案 1 :(得分:2)

如果输入文件中的某些行缺少列,则无法确切知道缺少哪一行。计算值的数量并在低于预期时中止或跳转到下一行应该足够了。

...除非您设置最后一列是可选的规则。我会详细说明这一点。

您的代码示例远非完整,但似乎您的问题是您在任何地方使用数组,除非将列名称与单元格值匹配。也使用数组:你不需要单独的变量,只会让它变得更难。这是可能的方法之一,不一定是最好的方法,但(我希望)足够明确:

<?php

$required_columns = array('name', 'age', 'height');
$input_data = array(
    array('John', 33, 169),
    array('Bill', 40, 180),
    array('Ashley', 21, 155),
    array('Vincent', 13), // Incomplete record
    array('Michael', 55, 182),
);
$output = array();

foreach($input_data as $row_index => $row){
    foreach($required_columns as $col_index => $column_name){
        if( isset($row[$col_index]) ){
            $output[$row_index][$column_name] = $row[$col_index];
        }
    }
}

print_r($output);

?>

为简单起见,我使用了$ row_index和$ col_index。

原始答案,仅供参考; - )

我无法理解您的规范,但PHP功能variable variables

<?php

$arr = array('foo', 'bar', 'bash', 'monkey', 'badger');

foreach($arr as $i){
    $$i = $i;
}

?>

现在你的脚本有这些变量可用:$ foo,$ bar ......它没用,而且有潜在的危险,但它可以满足您的需求。

答案 2 :(得分:1)

为什么不立即调用像

这样的栏
$arr['foo']

$arr[0]

答案 3 :(得分:1)

您正试图以不打算使用的方式使用语言结构。使用variable variables作为Alvaro提到的。

$arr = array('foo', 'bar', 'bash', 'monkey', 'badger');
foreach ($arr as $index => $key) {
    $$key = $data[$index];
}

$arr = array('foo', 'bar', 'bash', 'monkey', 'badger');
$result = array();
foreach ($arr as $index => $key) {
    $result[$key] = $data[$index];
}
extract($result);

简而言之,不要使用“list”,使用数组和关联的数组。编写辅助函数以使代码更清晰。

答案 4 :(得分:0)

如果要将$data的元素提取到当前上下文中,可以使用extract执行此操作。您可能会发现先调用array_intersect_key将$ data减少到要提取的元素是很有用的。

答案 5 :(得分:-1)

可以尝试这样:

$arr = array('foo', 'bar', 'bash', 'monkey', 'badger');
$data = "$".implode(",", $arr);
echo str_replace(",", ",$", $data);