【问题标题】:Comparison of methods appending arrays in a foreach loop在 foreach 循环中附加数组的方法比较
【发布时间】:2013-04-29 11:30:53
【问题描述】:

我已经设置了一个关联数组(带有用于测试的虚拟数据),如下所示:

// To hold dropdown filter options
$results['filters'] = array('Client' => array( array('a' => '1') ),
                            'Project' => array( array('b' => '2') ), 
                            'Status' => array( array('c' => '3') ), 
                            'User' => array( array('d' => '4') )
                           );

谁能告诉我为什么会这样:

// Add 'All' option to the top of each filter dropdown 
foreach($results['filters'] as $filter_key => $filter_value) {
    $results['filters'][$filter_key][] = array('name' => 'All');
}

但这不是:

// Add 'All' option to the top of each filter dropdown 
foreach($results['filters'] as $filter_key => $filter_value) {
    $filter_value[] = array('name' => 'All');
}

当我在循环内执行print_r($results) 时,它似乎正在工作(将行附加到现有数据),但在循环外检查它会使循环似乎对数组没有影响。

谢谢

【问题讨论】:

    标签: php arrays loops multidimensional-array foreach


    【解决方案1】:

    您需要传递$filter_value 作为参考(以& 开头)而不是副本。

    foreach($results['filters'] as $filter_key => &$filter_value) {
        $filter_value[] = array('name' => 'All');
    }
    

    Documentation:

    为了能够在循环内直接修改数组元素 在 $value 之前加上 &。在这种情况下,该值将由 参考。

    【讨论】:

    • 啊,感谢您的快速回答,现在这很有意义。我很惊讶我以前从未遇到过这样的事情。
    【解决方案2】:

    如果我理解正确 - 在下面的代码中,您只是将一个值分配给 $filter_value 而不是它的父数组:

    // Add 'All' option to the top of each filter dropdown 
    foreach($results['filters'] as $filter_key => $filter_value) {
        $filter_value[] = array('name' => 'All');
    }
    

    你可以这样做:

    $newResults = array();
    foreach($results['filters'] as $filter_key => $filter_value) {
        $newResults[$filter_key] = array('name' => 'All');
    }
    $results['filters'] = $newResults;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多