2017-08-09 46 views
0

用默认的键/值对定义一个新的多维数组的最佳方式是什么?如何将默认值合并到新的多维数组的子数组中?

我认为这是最好的代码示例说明如下:

$defaultOptions = ['foo' => 'bar', 'another' => 'value']; 
$mdArray = [ 
    'first' => [ 
     'title' => 'I am first', 
     $defaultOptions, 
    ], 
    'second' => [ 
     'title' => 'I am second', 
     $defaultOptions 
    ] 
]; 

这将产生:

Array 
( 
    [first] => Array 
       ( 
        [title] => I am first 
        [0] => Array 
          ( 
           [foo] => bar 
           [another] => value) 
         ) 
    [second] => Array 
       ( 
        [title] => I am second 
        [0] => Array 
          ( 
           [foo] => bar 
           [another] => value 
          ) 
       ) 
) 

我想从$defaultOptions$mdArray省略了0键,这样的键/值对将应用于与定义$defaultOptions的位置相同的级别。

有没有办法在数组定义中做到这一点,或者我是否必须稍后处理这个数组,并附加这些$defaultOptions

+1

使用'array_merge' –

回答

2

您可以通过两种方式实现它。

第一种选择是使用+操作符:

$mdArray = [ 
    'first' => ['title' => 'I am first'] + $defaultOptions, 
    'second' => ['title' => 'I am second'] + $defaultOptions 
]; 

+运算返回右手阵列附加到左手 阵列;对于这两个数组中存在的键,将使用左手阵列中的元素,而右边数组中的匹配元素将被忽略。

http://php.net/manual/en/language.operators.array.php

第二个选择是使用array_merge()功能:

$mdArray = [ 
    'first' => array_merge(['title' => 'I am first'], $defaultOptions), 
    'second' => array_merge(['title' => 'I am second'], $defaultOptions) 
]; 

如果输入阵列具有相同的字符串键,则该键后值 将覆盖前一个。但是,如果数组键 包含数字键,则后面的值不会覆盖原始值 值,但会被追加。输入数组中带有数字 键的值将使用从 结果数组中的零开始的递增键重新编号。

http://php.net/manual/en/function.array-merge.php

+0

完美的解决方案。我不想使用array_merge,而是使用本地php变量赋值。 – WraithLux

0

这可以用array_merge实现:

$defaultOptions = ['foo' => 'bar', 'another' => 'value']; 
$mdArray = [ 
    'first' => array_merge(['title' => 'I am first'], $defaultOptions), 
    'second' => array_merge(['title' => 'I am second'], $defaultOptions), 
]; 
2

您需要使用array_merge()

下面是更新后的代码:

<?php 

$defaultOptions = ['foo' => 'bar', 'another' => 'value']; 
$mdArray = [ 
    'first' => [ 
     'title' => 'I am first' 
    ], 
    'second' => [ 
     'title' => 'I am second' 
    ] 
]; 

foreach($mdArray as $key => $value){ 
    $mdArray[$key] = array_merge($mdArray[$key], $defaultOptions); 
} 

print_r($mdArray); 
?> 

这里是输出:

Array 
(
    [first] => Array 
     (
      [title] => I am first 
      [foo] => bar 
      [another] => value 
     ) 

    [second] => Array 
     (
      [title] => I am second 
      [foo] => bar 
      [another] => value 
     ) 

) 
0

纯粹是因为有不符合+循环方法贴出来,我会添加它。这会通过参考变量(&$a)将默认值添加到主数组中。

代码:

$defaultOptions=['foo'=>'bar','another'=>'value']; 
$mdArray = ['first'=>['title'=>'I am first'], 
      'second'=>['title'=>'I am second'] 
]; 
foreach($mdArray as &$a){ 
    $a+=$defaultOptions; 
} 
var_export($mdArray); 

输出:

array (
    'first' => 
    array (
    'title' => 'I am first', 
    'foo' => 'bar', 
    'another' => 'value', 
), 
    'second' => 
    array (
    'title' => 'I am second', 
    'foo' => 'bar', 
    'another' => 'value', 
), 
) 

并记录在案,array_replace()将执行此任务,以及(虽然它是一个不太直观的函数调用):

foreach($mdArray as &$a){ 
    $a=array_replace($a,$defaultOptions); 
}