【问题标题】:Get new value and keys of multidimensional php array with recursive function使用递归函数获取多维php数组的新值和键
【发布时间】: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() 删除重复项。

标签: php arrays recursion multidimensional-array nested


【解决方案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 我的回答对你有帮助吗?
猜你喜欢
  • 2013-01-15
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 2012-08-13
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多