将新键/值添加到数组中的所有现有记录

时间:2013-04-02 08:40:32

标签: php arrays

假设我有一个如下数组:

$list[] = array('a' => 1, 'b' => 4);
$list[] = array('a' => 2, 'b' => 5);
$list[] = array('a' => 3, 'b' => 6);

是否可以向所有数组元素添加新的Key & Value c => null,但 WITHOUT 循环遍历所有记录或使用map类似的功能?

最终结果应与此类似:

$list[] = array('a' => 1, 'b' => 4, 'c' => null);
$list[] = array('a' => 2, 'b' => 5, 'c' => null);
$list[] = array('a' => 3, 'b' => 6, 'c' => null);

实际上,我正在考虑在运行中制作第二个数组并将其与原始数组合,或者只是循环遍历数组并扩展它,然而,只是想知道是否有更好的替代方法可以做这一点。

2 个答案:

答案 0 :(得分:2)

不,如果没有遍历数组,无论是通过for循环显式,还是隐式使用array_walk或类似

,都无法做到这一点

答案 1 :(得分:2)

无耻:

array_walk($list, function(&$v){ $v['c'] = null; });

进一步评论

如果您担心数组的结构并希望某些键存在,即使它们没有明确定义,那么您也试图描述一些特定的东西 - 在这种情况下,您最好在类中定义该对象 - 从可读性和迭代性立场。

例如:

class MyObject {
  public $a; 
  public $b; 
  public $c;
  function __construct(){
     // this line is lazy but it's just a demo
     list($a,$b,$c) = func_get_args();
     $this->a = $a;
     $this->b = $b;
     $this->c = $c;
  }
}

$list[] = new MyObject(1, 4);
$list[] = new MyObject(2, 5);
$list[] = new MyObject(3, 6);

print_r($list);

run code

在这种情况下 - 如果我们在构造函数中没有指定 “c” - 它仍然隐式设置为 null 。因此,您之后不需要再次遍历$list数组。虽然为了完整性,我应该在这里指出可能存在速度记忆权衡。

输出:

Array
(
    [0] => MyObject Object
        (
            [a] => 1
            [b] => 4
            [c] => 
        )

    [1] => MyObject Object
        (
            [a] => 2
            [b] => 5
            [c] => 
        )

    [2] => MyObject Object
        (
            [a] => 3
            [b] => 6
            [c] => 
        )

 )