【问题标题】:Php - recursive recursive function to get all nodes on one level with the parentPhp - 递归递归函数,使所有节点与父级处于同一级别
【发布时间】:2015-04-04 15:06:55
【问题描述】:

我不太擅长递归函数。我阅读了所有的论坛,并试图围绕需要做的事情来思考,我就是无法理解,而且我的时间不多了。所以我需要寻求帮助。

我有下面的数组。我试图让所有公司都在一个层面上。所以返回的结果是,第一个元素是元素 0,然后 all_child_companies 下的第一个节点是元素 1,以此类推。

<?php

// array(
//   'id' => '1',
//   'name' => 'Company 1',
//   'address_id' => '15',
//   'emp_size' => '0',
//   'parent_id' => '0',
//   'is_beta' => '0',
//   'owner_id' => '1',
//   'created_at' => '2015-04-02 03:25:32',
//   'updated_at' => '2015-04-02 03:25:32',
//   'deleted_at' => NULL,
//   'industry' => '',
//   'avatar_file_name' => NULL,
//   'avatar_file_size' => NULL,
//   'avatar_content_type' => NULL,
//   'avatar_updated_at' => NULL,
//   'address' => array(
//     'id' => '15',
//     'street1' => '111 something street',
//     'street2' => '',
//     'street3' => '',
//     'city' => 'houston',
//     'state' => '0',
//     'zip' => '',
//     'created_at' => '2015-04-02 03:25:32',
//     'updated_at' => '2015-04-02 03:25:32',
//     'deleted_at' => NULL,
//     'address_id' => '0',
//     'address_type' => '',
//     'country' => ''
//   ),
//   'all_child_companies' => array(
//     0 => array(
//       'id' => '2',
//       'name' => 'Company 1',
//       'address_id' => '16',
//       'emp_size' => '55',
//       'parent_id' => '1',
//       'is_beta' => '1',
//       'owner_id' => '1',
//       'created_at' => '2015-04-02 03:25:32',
//       'updated_at' => '2015-04-02 03:25:32',
//       'deleted_at' => NULL,
//       'industry' => '',
//       'avatar_file_name' => NULL,
//       'avatar_file_size' => NULL,
//       'avatar_content_type' => NULL,
//       'avatar_updated_at' => NULL,
//       'address' => array(
//         'id' => '16',
//         'street1' => '222 something street',
//         'street2' => '',
//         'street3' => '',
//         'city' => 'tucson',
//         'state' => '0',
//         'zip' => '',
//         'created_at' => '2015-04-02 03:25:32',
//         'updated_at' => '2015-04-02 03:25:32',
//         'deleted_at' => NULL,
//         'address_id' => '0',
//         'address_type' => '',
//         'country' => ''
//       ),
//       'all_child_companies' => array(
//         0 => array(
//           'id' => '3',
//           'name' => 'Company 2',
//           'address_id' => '17',
//           'emp_size' => '15',
//           'parent_id' => '2',
//           'is_beta' => '0',
//           'owner_id' => '1',
//           'created_at' => '2015-04-02 03:25:32',
//           'updated_at' => '2015-04-02 03:25:32',
//           'deleted_at' => NULL,
//           'industry' => '',
//           'avatar_file_name' => NULL,
//           'avatar_file_size' => NULL,
//           'avatar_content_type' => NULL,
//           'avatar_updated_at' => NULL,
//           'address' => array(
//             'id' => '17',
//             'street1' => '333 something street',
//             'street2' => '',
//             'street3' => '',
//             'city' => 'tempe',
//             'state' => '0',
//             'zip' => '',
//             'created_at' => '2015-04-02 03:25:32',
//             'updated_at' => '2015-04-02 03:25:32',
//             'deleted_at' => NULL,
//             'address_id' => '0',
//             'address_type' => '',
//             'country' => ''
//           ),
//           'all_child_companies' => array(
//             0 => array(
//               'id' => '4',
//               'name' => 'Company 3',
//               'address_id' => '19',
//               'emp_size' => '100',
//               'parent_id' => '3',
//               'is_beta' => '0',
//               'owner_id' => '0',
//               'created_at' => '2015-04-02 05:24:34',
//               'updated_at' => '2015-04-02 05:24:34',
//               'deleted_at' => NULL,
//               'industry' => '',
//               'avatar_file_name' => NULL,
//               'avatar_file_size' => NULL,
//               'avatar_content_type' => NULL,
//               'avatar_updated_at' => NULL,
//               'address' => array(
//                 'id' => '19',
//                 'street1' => '333 something street',
//                 'street2' => '',
//                 'street3' => '',
//                 'city' => 'phoenix',
//                 'state' => '0',
//                 'zip' => '85042',
//                 'created_at' => '2015-04-02 05:24:34',
//                 'updated_at' => '2015-04-02 05:24:34',
//                 'deleted_at' => NULL,
//                 'address_id' => '0',
//                 'address_type' => '',
//                 'country' => 'United States Of America'
//               ),
//               'all_child_companies' => array(
// 
//               )
//             )
//           )
//         )
//       )
//     )
//   )
// )

提前感谢您的帮助。

我知道这不起作用,但这是我一直在想的..

/**
 * @param $needle_key
 * @param $array
 * @return bool
 */
public static function array_search_key($needle_key = 'all_child_companies', $array)
{
    if(isset($array['all_child_companies']) && !empty($array['all_child_companies'])){
        return self::array_search_key($needle_key, $array['all_child_companies']);
    }

    foreach ($array AS $key => $value) {
        if ($key == $needle_key) return $value;
        if (is_array($value)) {
            if (($result = self::array_search_key($needle_key, $value)) !== false)
                return $result;
        }
    }
    return false;
}

【问题讨论】:

  • 到目前为止您尝试过什么?向我们展示您当前的代码:)
  • 我用代码示例更新了问题。我不确定论坛是否会通知所有人更新..
  • 它会通知。在我的脑海中,你需要一个 foreach 来完成你正在尝试的事情。

标签: php arrays recursion


【解决方案1】:

这是一个简单的、有效的解决方案:

function resolveRecursion(array $result, array $array) {
    $result[] = $array; //add the current company to the result

    foreach($array['all_child_companies'] as $childCompany) {
        $result = resolveRecursion($result, $childCompany); //add all the children companies to the result
    }

    return $result;
}

$result = resolveRecursion([], $yourCompaniesArray);

【讨论】:

  • 谢谢函数resolveRecursion是我使用的解决方案。这十分完美。谢谢
【解决方案2】:

你可以试试这个函数:

function flatten_array($needle_key, $array) {
  $result = array($array);
  foreach ($array[$needle_key] as $key => $value) {
    $result = array_merge($result, flatten_array($needle_key, $value));
    unset($result[0][$needle_key][$key]);
  }
  return $result;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多