【问题标题】:Storing value in unknown depth of multidimensional array在多维数组的未知深度中存储值
【发布时间】:2014-03-17 01:15:24
【问题描述】:

我在某处保存了这个 exath 路径:

Array
(
    [0] => library
    [1] => 1
    [2] => book
    [3] => 0
    [4] => title
    [5] => 1
)

我有一些数组,我想改变这个索引的值:

$values[library][1][book][0][title][1] = "new value";

我不知道该怎么做,因为可以有任何(未知)数量的维度。有什么提示吗?

【问题讨论】:

    标签: php indexing depth


    【解决方案1】:

    创建一个这样做的函数是有意义的,所以:

    function array_path_set(array & $array, array $path, $newValue) {
        $aux =& $array;
        foreach ($path as $key) {
            if (isset($aux[$key])) {
                $aux =& $aux[$key];
            } else {
                return false;
            }
        }
        $aux = $newValue;
        return true;
    }
    $values = array(
        'library' => array(
            1 => array(
                'book' => array(
                    0 => array(
                        'title' => array(
                            1 => 'MAGIC VALUE!',
                        ),
                    ),
                ),
            ),
        ),
    );
    $path = array('library', 1, 'book', 0, 'title', 1);
    $newValue = 'ANOTHER MAGIC VALUE!';
    
    var_dump($values);
    var_dump(array_path_set($values, $path, $newValue));
    var_dump($values);
    

    【讨论】:

    • 谢谢!这很好用。经过测试,它不会覆盖数组中的其他值。
    【解决方案2】:

    试试

    foreach ($array as $val) {
       $indexes .= "[$val]";
    }
    ${'output'.$indexes} = 'something';
    

    或者

    $indexes = '';
    foreach ($array as $val) {
       $indexes .= "[$val]";
    }
    $output = 'values'.$indexes;
    $$output = 'something';
    

    【讨论】:

    • 测试:设置这个N维数组。 $output["library"][1]["book"][0]["title"][1] = "old value"; 并尝试访问它:${'output["library"][1]["book"][0]["title"][1]'} = "new value"; .. 但是如果我print_r($output),该值保持不变
    • 我对解决方案所做的更改怎么样?
    【解决方案3】:

    您是否尝试为图书馆 1 中书 0 的书名提供新值?如果是这样,您将必须搜索图书馆“1”,图书“0”,然后更改“标题”的值。因此,如果数组中的所有值都具有相同的六个条目,则从 loc = 0 开始查看 loc+1(图书馆 ID)、loc+3(图书 ID)和 loc+5 处的值 .. 更改标题)..如果不是 loc 增加 6 并继续搜索。

    [听起来像是作业,所以没有提供代码。如果我错了,请原谅我。]

    【讨论】:

    • 谢谢.. 我不需要代码,我只需要知道一些提示。嗯,是的,我可以轻松读取数据,但我该如何更改它们呢?
    【解决方案4】:

    以防万一你不知道,关键

    $values["library"][1]["book"][0]["title"][1]

    与您帖子中的数组示例不同。假设数组是 $values,它有五个元素:

    $values = Array
    (
        [0] => "library"
        [1] => 1
        [2] => "book"
        [3] => 0
        [4] => "title"
        [5] => 1
    )
    $values[0] = "Library";
    $values[1] = "1";
    $values[2] = "book";
    $values[3] = "0";
    etc...
    

    这个数组结构是你想要的吗?如果没有,请以更完整的结构回帖,以便我们提供帮助。

    此外,您需要在字符串周围加上引号 - 为了清楚起见,我已经包括在内

    您可以查看以下link 的array_search。一些海报包含了多维数组搜索的示例,还有其他示例。在“多维数组搜索”上进行谷歌搜索,您可能会找到解决方案。如果您需要更多指导,请发回您的详细信息。

    【讨论】:

    • 我猜他有两个不同的数组,一个包含另一个数组的索引;第二个是未知深度的多维
    【解决方案5】:

    试试这个 ->

    $keys = array('0'=>'for','1'=>'test','2'=>'only');
    $value='ok';
    
    function addArrayPathWithValue($keys,$value,$array = array(),$current = 
    array())
    {
        $function = __FUNCTION__;
    
        if (count($current)==0)
        {
            $keys = array_reverse($keys);
            $current = $value;
        }
    
        if (count($keys)==0)
        {
           return $current;
        }
    
        $array[array_shift($keys)]=$current;
    
        return $function($keys,$value,NULL,$array);
    }
    
    $array = addArrayPathWithValue($keys,$value);
    print_r($array);
    //output: Array ( [for] => Array ( [test] => Array ( [only] => ok ) ) )
    

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 2017-07-03
      • 2021-01-13
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 2017-05-09
      • 2023-03-25
      相关资源
      最近更新 更多