在PHP中创建奇怪的数组?

时间:2011-04-22 10:56:55

标签: php arrays variables scope

我正在阅读PHP manual的mysqli_stmt_bind_result,并在comments中看到了这段代码:

while ( $field = $meta->fetch_field() ) {
  $parameters[] = &$row[$field->name];
}

鉴于在该行之前既没有$ params也没有$ row,为什么/该行如何工作?

4 个答案:

答案 0 :(得分:6)

PHP实际上没有变量声明。这意味着在某些情况下,您可以引用变量而无需事先声明它们。我说一些案例是因为:

foreach($undefinedArray as $key=>$value){
    // will give a notice and a warning
    // notice: undefined variable
    // warning: invalid argument to foreach
}

但这并不意味着你不能这样做:

for($i=0;$i<5;$i++){
    $undefinedArray[]=$i;
}
// will create an array with 5 indexes, each holding the numbers 0 through 4

这是有效的,因为找不到$undefinedArray并在运行中创建。

现在,关于你自己的情况。我会假设你的意思this post。我不得不承认,这是一个非常有趣的解决方案,我会试着抑制自己对那里的任何不良做法发表评论,但让我们继续解释它!

$params[] = &$row[$field->name]; 

这是魔术发生的地方,实际上是由于&amp ;.因为&$row['unknown_index'],实际上会创建索引!

这意味着上面的陈述做了两件事。首先,它创建一个数组,每个列名都保存为$row$row[$field->name])中的索引。然后它会保存指向$row$params的每个元素的指针。

call_user_func_array(array($stmt, 'bind_result'), $params); 

这是$stmt->bind_result()。但是将$params中的每个元素作为参数传递给bind_result。因为它们是通过引用传递的,所以$ row的每个索引都将保存每个选定的字段。

其余的应该很容易理解。

如果您有任何疑问。随意问一下!

答案 1 :(得分:4)

从第一条评论开始。

    $variables = array();
    $data = array();
    $meta = $result->result_metadata();

    while($field = $meta->fetch_field())
        $variables[] = &$data[$field->name]; // pass by reference

    call_user_func_array(array($result, 'bind_result'), $variables);

那么问题是什么?

答案 2 :(得分:1)

它不起作用,因为如你所说,这些变量不存在。

答案 3 :(得分:1)

来自C,C ++编程学校,我有时很难接受PHP的堆栈和堆管理。 PHP会自动执行太多操作,这给开发人员带来了太多的自由。无论如何,在Dexter的精彩解释之后,我确定Khez已经清除了他的怀疑。我只是想在代码中添加我的分数,以便更好地了解在here提到的代码中发生的事情。

$stmt = $conn->prepare ("SELECT * FROM sample");
$stmt->execute ();
$meta = $stmt->result_metadata();

$params  = array (); // You can skip these lines, PHP initiates arrays on
$row     = array (); // the fly. I prefer doing as much of these initializations
$results = array (); // as possible, on my own.

while ($field = $meta->fetch_field())
{
    /* Again, you can skip the following line, PHP will automatically create
     * a new key/value pair and since we are using the same name for the
     * container of that key/value pair, PHP will actually keep appending. 
     * So after N loops you have an array that contains N key/value pairs
     */
    $row [$field->name] = 0;

    $params[] =& $row[$field->name];
}

/* So now, $params is an array of N references, where reference i points to 
 * the value part of i-th key/val pair in $row 
 */

call_user_func_array (array ($stmt, 'bind_result'), $params);
$index = 0;
while ($stmt->fetch ())
{
    // again, one can skip this. PHP creates this on the fly.
    $results[$index] = array();
    foreach ($row as $key => $val)
    {
        // skip making that temp array!
        $results[$index][$key] = $val;
    }

    $index += 1;
}

return $results;

就是这样。希望这段代码有意义。

P.S:作为一个事后的想法,我想澄清一下我对PHP的疑虑。如果我尝试填充$ results如下:

$results[$index][] = $row;

或者像这样:

$results[] = $row;

$ results中的所有键/值对重复包含相同的集合。希望有人能够对PHP的这种行为有所了解。