使用递归函数获取多维php数组的新值和键

Posted

技术标签:

【中文标题】使用递归函数获取多维php数组的新值和键【英文标题】:Get new value and keys of multidimensional php array with recursive function 【发布时间】:2021-10-29 16:01:01 【问题描述】:

如何使以下函数适用于无限的嵌套数组,而无需像我那样手动执行此操作? (不使用嵌套在另一个 foreach 中的 foreach)。

这是一个数组,但可以嵌套更多并且有更多数据:

Array
(
    [options] => Array
        (
            [company_details] => Array
                (
                    [contact] => Array
                        (
                            [company_name] => Some Name
                            [email] => info@example.com
                            [phone_mobile] => 043333333
                            [phone_work] => 012222233
                        )

                )

        )

    [another_array] => some_data
)

循环:

foreach ($form_data as $key=>$value)  // options/css/etc..      

   $key_1 = $key;
   if (!is_array($value)) 
      $new_value = $form_data[$key_1];
      $array[$key_1] = $new_value;
   

   if (is_array($value)) 
      foreach ($value as $key=>$value)  // company_details/shop_settings/etc..

         $key_2 = $key;
         if (!is_array($value)) 
            $new_value = $form_data[$key_1][$key_2];
            $array[$key_1][$key_2] = $new_value;
         

         if (is_array($value)) 

            foreach ($value as $key=>$value)  // contact/social_links/etc..

               $key_3 = $key;
               if (!is_array($value)) 
                  $new_value = $form_data[$key_1][$key_2][$key_3];
                  $array[$key_1][$key_2][$key_3] = $new_value;
               

               if (is_array($value)) 

                  foreach ($value as $key=>$value)  // email/mobile/etc..
                     
                     $key_4 = $key;
                     if (!is_array($value)) 
                        $new_value = $form_data[$key_1][$key_2][$key_3][$key_4];
                        $array[$key_1][$key_2][$key_3][$key_4] = $new_value;
                     

                     if (is_array($value)) 

                        foreach ($value as $key=>$value)  // email/mobile/etc..
                           
                           $key_5 = $key;
                           if (!is_array($value)) 
                              $new_value = $form_data[$key_1][$key_2][$key_3][$key_4][$key_5];
                              $array[$key_1][$key_2][$key_3][$key_4][$key_5] = $new_value;
                           
                        
                        
                     
                  
                  
               
            
         
      
   

我试过THIS,但问题是数组没有停在最后一个键处。所以改为得到这个:

function enumerateKeys($array, &$keys) 

   if(!isset($keys)) 
       $keys = array();
   

   foreach($array as $key => $value) 
       if(is_array($value)) 
           $keys[] = $key; /* Moved below if() to enumerate only array keys */
           enumerateKeys($value, $keys);
       
   
   


// EXPECTED OUTPUT:
Array
(
    [0] => options
    [1] => company_details
    [2] => contact
    [4] => company_name
)

Array
(
    [0] => options
    [1] => company_details
    [2] => contact
    [4] => email
)

Array
(
    [0] => options
    [1] => company_details
    [2] => contact
    [4] => phone_number
)

我得到了这个:

// WRONG OUTPUT:
Array
(
    [0] => options
    [1] => company_details
    [2] => contact
)

Array
(
    [0] => options
    [1] => company_details
    [2] => contact
)

Array
(
    [0] => options
    [1] => company_details
    [2] => contact
)

我也尝试添加最后一个键,但是它没有得到索引键号并且在最后一个键之后它没有停止,它只是向数组中添加更多数据,像这样将所有东西混合在一起:


function enumerateKeys($array, &$keys) 

   if(!isset($keys)) 
       $keys = array();
   

   foreach($array as $key => $value) 
       if(is_array($value)) 
           $keys[] = $key; /* Moved below if() to enumerate only array keys */
           enumerateKeys($value, $keys);
           
       
       $keys[$key] = $value;
   
   
  


//OUTPUT:

Array
(
    [0] => options
    [1] => company_details
    [2] => contact
    [company_name] => Some Name
)

Array
(
    [0] => options
    [1] => company_details
    [2] => contact
    [company_name] => Some Name
    [email] => info@example.com
)

Array
(
    [0] => options
    [1] => company_details
    [2] => contact
    [company_name] => Some Name
    [email] => info@example.com
    [phone_mobile] => 04333333333
)

【问题讨论】:

输入是什么? @Barmar 我已经编辑了我的问题,您可以在问题顶部找到数组 另一个问题只想要其中包含嵌套数组的数组元素的键。从if 中取出$keys[] = $key; 以获取所有密钥。 @Barmar 我已将其移至 if 上方,但现在我在末尾得到了 4 个等于数组,每个数组都有所有键。 options|company_details|contact|company_name|email|phone_number|etc.. 您可以使用array_unique() 删除重复项。 【参考方案1】:

您可以在递归执行函数时构建一个新数组并向其中添加元素。

这样的代码可以正常工作并按预期返回数组结构:

$array = [
    'options' => [
        'company_details' => [
            'contact' => [
                'company_name' => 'Some Name',
                'email' => 'info@example.com',
                'phone_mobile' => 043333333,
                'phone_work' => 012222233
            ]
        ]
    ]
];

function enumerateKeys($array, &$keys = null)

    $newArray = [];

    if (!isset($keys)) 
        $keys = [];
    

    foreach ($array as $key => $value) 
        if (is_array($value)) 
            $keys[] = $key; /* Moved below if() to enumerate only array keys */
            return enumerateKeys($value, $keys);
        
        $keys[] = $key;
        $newArray[] = $keys;
        array_pop($keys);

        if (count($newArray) === count($array, true)) 
            return $newArray;
        
    


$arrays = enumerateKeys($array);

$arrays 输出为:

array (size=4)
  0 => 
    array (size=4)
      0 => string 'options' (length=7)
      1 => string 'company_details' (length=15)
      2 => string 'contact' (length=7)
      3 => string 'company_name' (length=12)
  1 => 
    array (size=4)
      0 => string 'options' (length=7)
      1 => string 'company_details' (length=15)
      2 => string 'contact' (length=7)
      3 => string 'email' (length=5)
  2 => 
    array (size=4)
      0 => string 'options' (length=7)
      1 => string 'company_details' (length=15)
      2 => string 'contact' (length=7)
      3 => string 'phone_mobile' (length=12)
  3 => 
    array (size=4)
      0 => string 'options' (length=7)
      1 => string 'company_details' (length=15)
      2 => string 'contact' (length=7)
      3 => string 'phone_work' (length=10)

注意:如果您想要 company_name、email 等的值,只需将 if 后面的 $keys[] = $key; 更改为 $keys[] = $value;

【讨论】:

@Nash 我的回答对你有帮助吗?

以上是关于使用递归函数获取多维php数组的新值和键的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中递归创建多维数组

js递归(二)——合并多维数组

递归函数和多维数组

如何在 PHP 中循环遍历多维数组并按名称递归删除键?

从数据库结果生成多维数组的递归函数

php无限极分类递归写入多维数组的方法