如何实现返回嵌套数组的自定义重组函数?

发布于 2024-09-14 13:59:41 字数 4196 浏览 1 评论 0原文

我的数据来自一个数据库,该数据库提取所有子类别和相关信息:

$data = array(
    array(
        'destination_name' => 'Ohio Resort',
        'destination_slug' => 'ohio',
        'subcategory_name' => 'Bird Hunting',
        'subcategory_slug' => 'bird-hunting',
        'category_name' => 'Hunting',
        'category_slug' => 'hunting',
    ),
    array(
        'destination_name' => 'Ohio Resort',
        'destination_slug' => 'ohio',
        'subcategory_name' => 'Bear Hunting',
        'subcategory_slug' => 'bear-hunting',
        'category_name' => 'Hunting',
        'category_slug' => 'hunting',
    ),
    array(
        'destination_name' => 'Maryland Resort',
        'destination_slug' => 'maryland',
        'subcategory_name' => 'Bird Hunting',
        'subcategory_slug' => 'bird-hunting',
        'category_name' => 'Hunting',
        'category_slug' => 'hunting',
    ),
    array(
        'destination_name' => 'Cali Resort',
        'destination_slug' => 'california',
        'subcategory_name' => 'Sledding',
        'subcategory_slug' => 'sledding',
        'category_name' => 'Winter Sports',
        'category_slug' => 'winter-sports',
    ),
);

我正在用它生成 xml,但我需要根据我的特定需求对其进行重新排序。假设我指定 functionCall( $data, array('destination', 'category', 'subcategory') );

我希望它以这种形式返回:

Array(
   [california] => array(
      [_name] => 'California',
      [winter-sports] => array(
         '_name' => 'Winter Sports',
         [0] => array(
            subcategory_name => Sledding,
            subcategory_slug => sledding
         )
      )
   ),
   [maryland] => array(      
      [_name] => 'Maryland',
      [hunting] => array(
         '_name' => 'Hunting',
         [0] => array(
            subcategory_name => Bird Hunting,
            subcategory_slug => bird hunting
         )
      )
   ),
   [ohio] => array(
      [_name] => 'Ohio',
      [hunting] => array(
         '_name' => 'Hunting',
         [0] => array(
            subcategory_name => Bird Hunting,
            subcategory_slug => bird-hunting
         ),
         [1] => array(
            subcategory_name => Bear Hunting,
            subcategory_slug => bear-hunting
         )
      )
   ),

);

如果我指定 functionCall( $data, array('category', 'subcategory') ); 我希望它返回:

Array(
          [winter-sports] => array(
             '_name' => 'Winter Sports',
             [0] => array(
                subcategory_name => Sledding,
                subcategory_slug => sledding
             )
          ),

          [hunting] => array(
             '_name' => 'Hunting',
             [0] => array(
                subcategory_name => Bird Hunting,
                subcategory_slug => bird hunting
             ),
             [1] => array(
                subcategory_name => Bear Hunting,
                subcategory_slug => bear-hunting
             )
          )
);

有人可以提供一些关于创建将数据作为第一个参数、将级别嵌套作为第二个参数的函数的指示吗参数并以正确的格式返回它?

到目前为止,我正在手动进行重组:

$data = array();
foreach( $categories as $res ) {
    $destinationSlug = $res['destination_slug'];
    $destinationName = $res['destination_name'];
    $categorySlug = $res['category_slug'];
    $categoryName = $res['category_name'];
    if ( !in_array( $destinationSlug, array_keys( $data ) ) ) {
    $data[ $destinationSlug ] = array();
    $data[ $destinationSlug ]['_name'] = $destinationName;
    }
    if ( !in_array( $categorySlug, array_keys( $data[ $destinationSlug ] ) ) ) {
    $data[ $destinationSlug ][ $categorySlug ] = array();
    $data[ $destinationSlug ][ $categorySlug ]['_name'] = $categoryName;
    }
    $data[ $destinationSlug ][ $categorySlug ][] = array(
    'subcategory_slug' => $res['subcategory_slug'],
    'subcategory_name' => $res['subcategory_name'],
    );
}
return $data;

随机注释:

  • 数据将始终采用这种格式。总会有 _slug_name 对。
  • 我需要能够按字母顺序对结果进行排序

I have this data coming from a database which pulls all subcategories and relevant info:

$data = array(
    array(
        'destination_name' => 'Ohio Resort',
        'destination_slug' => 'ohio',
        'subcategory_name' => 'Bird Hunting',
        'subcategory_slug' => 'bird-hunting',
        'category_name' => 'Hunting',
        'category_slug' => 'hunting',
    ),
    array(
        'destination_name' => 'Ohio Resort',
        'destination_slug' => 'ohio',
        'subcategory_name' => 'Bear Hunting',
        'subcategory_slug' => 'bear-hunting',
        'category_name' => 'Hunting',
        'category_slug' => 'hunting',
    ),
    array(
        'destination_name' => 'Maryland Resort',
        'destination_slug' => 'maryland',
        'subcategory_name' => 'Bird Hunting',
        'subcategory_slug' => 'bird-hunting',
        'category_name' => 'Hunting',
        'category_slug' => 'hunting',
    ),
    array(
        'destination_name' => 'Cali Resort',
        'destination_slug' => 'california',
        'subcategory_name' => 'Sledding',
        'subcategory_slug' => 'sledding',
        'category_name' => 'Winter Sports',
        'category_slug' => 'winter-sports',
    ),
);

I am generating xml with this, but I need to reorder it based on my specific needs. Let's say I specify functionCall( $data, array('destination', 'category', 'subcategory') );

I want it to return it in this form:

Array(
   [california] => array(
      [_name] => 'California',
      [winter-sports] => array(
         '_name' => 'Winter Sports',
         [0] => array(
            subcategory_name => Sledding,
            subcategory_slug => sledding
         )
      )
   ),
   [maryland] => array(      
      [_name] => 'Maryland',
      [hunting] => array(
         '_name' => 'Hunting',
         [0] => array(
            subcategory_name => Bird Hunting,
            subcategory_slug => bird hunting
         )
      )
   ),
   [ohio] => array(
      [_name] => 'Ohio',
      [hunting] => array(
         '_name' => 'Hunting',
         [0] => array(
            subcategory_name => Bird Hunting,
            subcategory_slug => bird-hunting
         ),
         [1] => array(
            subcategory_name => Bear Hunting,
            subcategory_slug => bear-hunting
         )
      )
   ),

);

If I specify functionCall( $data, array('category', 'subcategory') ); I want it to return:

Array(
          [winter-sports] => array(
             '_name' => 'Winter Sports',
             [0] => array(
                subcategory_name => Sledding,
                subcategory_slug => sledding
             )
          ),

          [hunting] => array(
             '_name' => 'Hunting',
             [0] => array(
                subcategory_name => Bird Hunting,
                subcategory_slug => bird hunting
             ),
             [1] => array(
                subcategory_name => Bear Hunting,
                subcategory_slug => bear-hunting
             )
          )
);

Could someone offer some pointers on creating the function that takes the data as the first argument and the level-nesting as the second argument and returns it in the proper format?

So far I'm doing the reorganization manually:

$data = array();
foreach( $categories as $res ) {
    $destinationSlug = $res['destination_slug'];
    $destinationName = $res['destination_name'];
    $categorySlug = $res['category_slug'];
    $categoryName = $res['category_name'];
    if ( !in_array( $destinationSlug, array_keys( $data ) ) ) {
    $data[ $destinationSlug ] = array();
    $data[ $destinationSlug ]['_name'] = $destinationName;
    }
    if ( !in_array( $categorySlug, array_keys( $data[ $destinationSlug ] ) ) ) {
    $data[ $destinationSlug ][ $categorySlug ] = array();
    $data[ $destinationSlug ][ $categorySlug ]['_name'] = $categoryName;
    }
    $data[ $destinationSlug ][ $categorySlug ][] = array(
    'subcategory_slug' => $res['subcategory_slug'],
    'subcategory_name' => $res['subcategory_name'],
    );
}
return $data;

Random notes:

  • The data will always be in this format. There will always be a _slug and _name pair.
  • I will need to have the ability to alphabetically order the results

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

静赏你的温柔 2024-09-21 13:59:41

您可以使用 uasort,它允许使用用户定义的函数对数组进行排序。但我建议让你自己的函数来做这件事。

you could use uasort which allows for a user defined function to be used for sorting the array,. but i would suggest having your own function do it.,

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文