【问题标题】:How to synchronously nest subarrays from one array into subarrays of another?如何将一个数组中的子数组同步嵌套到另一个数组的子数组中?
【发布时间】:2017-11-10 17:09:51
【问题描述】:

我有 2 个多维数组:

$category = array (
    37 = array (id=1, name=joe, boss=kev)
    73 = array (id=55, name=diane, boss=rox)
    11 = array (id=4, name=bideo, boss=julia)
)  

$other_variable = array (
    1 = array (
        picture1 = array (name=zee, id=4),
        picture2 = array (name=izzy, id=1)
    )
    2 = array (
        picture1 = array (name=foo, id=55),
        picture2 = array (name=ido, id=44)        
    )
    3 = array (
        picture1 = array (name=wheez, id=87),
        picture2 = array (name=ardu, id=9)
    )
)  

我想把它们组合起来,这样

$category = array (
    37 = array (
        id=1, 
        name=joe, 
        boss=kev, 
        other_variable = array (
            picture1 = array (name=zee, id=4),
            picture2 = array (name=izzy, id=1)
    ),

    73 = array (
        id=55, 
        name=diane, 
        boss=rox, 
        other_variable = array (
            picture1 = array (name=foo, id=55),
            picture2 = array (name=ido, id=44)
    ),
    11 = array (
        id=4, 
        name=bideo, 
        boss=julia, 
        other_variable = array (
            picture1 = array (name=wheez, id=87),
            picture2 = array (name=ardu, id=9)
    )
)  

我试过了

 $new_array = array_map(null, $category, $other_variable);  

这结合了两个数组,但它在数组中创建了几个嵌套级别。我正在寻找更清洁的东西,将 $category 维护为父数组。

【问题讨论】:

  • 您的预期输出中的$other_variable[1],[2] 是什么?
  • 谢谢@SahilGulati。我不确定你的意思,但我已经扩展了期望的结果以更好地解释我所追求的。

标签: php arrays multidimensional-array pass-by-reference array-map


【解决方案1】:

你期待这样的事情吗?这里我们使用nextcurrent 函数来增加数组的内部指针并获取当前值。

Try this code snippet here

foreach($category as &$value)
{
    $value["other_variable"]=current($other_variable);
    next($other_variable);
}
print_r($category);

【讨论】:

    【解决方案2】:

    使用array_map() 同步迭代两个数组,您走在了正确的道路上,但遗憾的是,该函数会杀死您的第一级键。

    来自array_map() manual

    当且仅当仅传递一个数组时,返回的数组将保留数组参数的键。如果传递了多个数组,则返回的数组将具有连续的整数键。

    array_walk() 将是一个更简洁/更合适的函数调用,用于修改$category 数组的任务。 array_walk() 允许您修改您的$category 数组并同步迭代您的$other_variable 数组(作为可选的userdata 参数),而无需任何额外的迭代函数调用(例如next())。

    代码:(Demo)

    $category=[
        37=>["id"=>1,"name"=>"joe","boss"=>"kev"],
        73=>["id"=>55,"name"=>"diane","boss"=>"rox"],
        11=>["id"=>4,"name"=>"bideo","boss"=>"julia"]
    ];
    
    $other_variable=[
        1=>["picture1"=>["name"=>"zee","id"=>4],"picture2"=>["name"=>"izzy","id"=>1]],
        2=>["picture1"=>["name"=>"foo","id"=>55],"picture2"=>["name"=>"ido","id"=>44]],
        3=>["picture1"=>["name"=>"wheez","id"=>87],"picture2"=>["name"=>"ardu","id"=>9]]
    ];
    
    array_walk($category,function(&$v,$k,$ov){$v['other_variable']=current($ov);},$other_variable);
    var_export($category);
    

    输出:

    array (
      37 => 
      array (
        'id' => 1,
        'name' => 'joe',
        'boss' => 'kev',
        'other_variable' => 
        array (
          'picture1' => 
          array (
            'name' => 'zee',
            'id' => 4,
          ),
          'picture2' => 
          array (
            'name' => 'izzy',
            'id' => 1,
          ),
        ),
      ),
      73 => 
      array (
        'id' => 55,
        'name' => 'diane',
        'boss' => 'rox',
        'other_variable' => 
        array (
          'picture1' => 
          array (
            'name' => 'zee',
            'id' => 4,
          ),
          'picture2' => 
          array (
            'name' => 'izzy',
            'id' => 1,
          ),
        ),
      ),
      11 => 
      array (
        'id' => 4,
        'name' => 'bideo',
        'boss' => 'julia',
        'other_variable' => 
        array (
          'picture1' => 
          array (
            'name' => 'zee',
            'id' => 4,
          ),
          'picture2' => 
          array (
            'name' => 'izzy',
            'id' => 1,
          ),
        ),
      ),
    )
    

    后期编辑:

    修改$other_variable数组的其他方法(在迭代过程解决时有效地清空它)包括:

    $category=array_map(function($v)use(&$other_variable){
        return $v+=['other_variable'=>array_shift($other_variable)];
    },$category);
    

    foreach($category as &$value){
        $value["other_variable"]=array_shift($other_variable);
    }
    

    显然,只有在您不打算使用$other_variable 向下脚本或者您要声明数组的副本以供以后使用时,才应使用这些方法。

    【讨论】:

    • 谢谢@mickmackusa。在我的示例中,array_walk 最终比 Sahil Gulati 的答案稍慢(0.008 秒对 0.00043 秒)。
    • 有趣。感谢您的反馈。这并不意外,因为循环通常胜过函数式编程。只有当数组大小变大时,我才看到函数式迭代器输出执行简单的循环。
    • 如果您要在全局范围内使用“通过引用传递”&$value 技术,建议您在完成后使用 unset(&$value);,以免干扰您的任何进程“下脚本”。
    • 没问题。这是否适用于我正在处理的另一个示例,即对于较小的数组,array_search 可能更快,而对于较大的数组,您的迭代器解决方案是最好的?
    • 效率损失(在您的其他问题上执行迭代array_search()es 时会随着数组大小的缩小而减少,但我不希望出现这些情况(当两个数组都相对较小时)对用户来说是最明显的。
    猜你喜欢
    • 1970-01-01
    • 2020-05-07
    • 2016-10-19
    • 2013-01-15
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2022-06-11
    • 2015-11-18
    相关资源
    最近更新 更多