【问题标题】:How to set a deep array in PHP如何在 PHP 中设置深度数组
【发布时间】:2012-11-13 10:54:05
【问题描述】:

假设我有以下功能

function setArray(&$array, $key, $value)
{
    $array[$key] = $value;     
}

在上面的函数中,key只有一级,如果我想在2级或3级设置key,如何重写函数?

例如

 $array['foo']['bar'] = 'test';

我想用同样的函数来设置数组值

【问题讨论】:

  • 为什么需要一个函数?这几乎和 isTrue 函数一样有用。
  • 因为密钥将从文件中读取,格式为 'foo.bar'

标签: php


【解决方案1】:

这个应该可以的。使用此函数,您可以通过传递包含由 . 分隔的键的单个字符串来设置任何深度的数组元素

function setArray(&$array, $keys, $value) {
  $keys = explode(".", $keys);
  $current = &$array;
  foreach($keys as $key) {
    $current = &$current[$key];
  }
  $current = $value;
}

您可以按如下方式使用它:

$array = Array();
setArray($array, "key", Array('value' => 2));
setArray($array, "key.test.value", 3);
print_r($array);

输出:

Array (
    [key] => Array
        (
            [value] => 2
            [test] => Array
                (
                    [value] => 3
                )

        )

)

【讨论】:

  • isset() 部分是不必要的,因为 PHP 会在您进行引用时自动创建插槽和空数组。
  • 嘿@MarcDefiant - 知道这是否适用于php,因为'by reference'已被弃用?
  • 这正是我所需要的,谢谢。 (挣扎了 30 分钟才想出这样的东西……)
  • @craigh 通过引用调用已被弃用。不通过引用创建函数。
【解决方案2】:

你可以使用array_merge_recursive

$array = array("A" => "B");
$new['foo']['bar'] = 'test';
setArray($array, $new);
var_dump($array);

输出

array (size=2)
  'A' => string 'B' (length=1)
  'foo' => 
    array (size=1)
      'bar' => string 'test' (length=4)

使用的功能

function setArray(&$array, $value) {
    $array = array_merge_recursive($array, $value);
}

【讨论】:

    【解决方案3】:

    这个函数应该做,key应该是一个数组,例如array('foo', 'bar')

    function setArray(&$array, array $keys, $value) {
      foreach($keys as $key) {
        if(!isset($array[$key])) {
          $array[$key] = array();
        }
        $array = &$array[$key];
      }
      $array = $value;
    }
    
    $arr = array();
    setArray($arr, array('first', 'second'), 1);
    var_dump($arr);
    // dumps array(1) { ["first"]=> array(1) { ["second"]=> int(1) } } 
    

    经过测试并且有效。

    【讨论】:

      【解决方案4】:

      使用array_replace_recursive 而不是array_merge_recursive,因为它可以正确处理同键场景。看到这个https://3v4l.org/2ICmo

      【讨论】:

        【解决方案5】:

        就像这样:

        function setArray(&$array, $key1, $key2, $value)
        {
            $array[$key1][$key2] = $value;     
        }
        

        但是为什么要使用函数呢?像这样使用它:

        setArray($array, 'foo', 'bar', 'test');
        

        花更多的时间来写这样的东西:

        $array[1][2] = 'test';
        

        【讨论】:

          猜你喜欢
          • 2020-06-15
          • 2019-12-03
          • 2018-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-19
          • 2015-11-27
          • 2022-11-20
          相关资源
          最近更新 更多