将二维数组数据按 1 列分组,并在每组中从其他列创建子数组

问题描述 投票:0回答:3

所以我正在一个使用 Doctrine 作为 ORM 的网站上工作,结果我得到了以下数组:

Array (
    [0] => Array (
        [c_cat_id] => 1
        [c_title] => Programas e projetos
        [p_menu] => PBA BR 163
        [p_page_id] => 1
    )
    [1] => Array (
        [c_cat_id] => 1
        [c_title] => Programas e projetos
        [p_menu] => Outros projetos
        [p_page_id] => 3
    )
) 

是否可以将此数组(在 PHP 中)转换为如下形式:

Array (
    [0] => Array (
        [c_cat_id] => 1
        [c_title] => Programas e projetos
        [pages] => Array (
            [0] => Array (
                [p_page_id] => 1
                [p_menu] => PBA BR 163
            )
            [1] => Array (
                [p_page_id] => 3
                [p_menu] => Outros projetos
            )
        )
    )
)
php arrays multidimensional-array grouping
3个回答
1
投票

已测试并工作:

代码:

$original = array(
  array(
    "c_cat_id" => "1",
    "c_title" => "Programas e projetos",
    "p_menu" => "PBA BR 163",
    "p_page_id" => "1"),
  array(
    "c_cat_id" => "1",
    "c_title" => "Programas e projetos",
    "p_menu" => "Outros projetos",
    "p_page_id" => "3"),
  array(
    "c_cat_id" => "2",
    "c_title" => "Another Cat",
    "p_menu" => "Outros projetos",
    "p_page_id" => "4"),
);
$result = array();

foreach ($original as $row) {
  $cat = $row['c_cat_id'];
  if (!isset($result[$cat])) {
    $result[$row['c_cat_id']] = array(
      'c_cat_id'=>$row['c_cat_id'],
      'c_title'=>$row['c_title'],
      'pages'=>array(),
    );
  }
  unset($row['c_cat_id'],$row['c_title']);
  $result[$cat]['pages'][] = $row;
}

var_dump($result);

结果:

array(2) {
  [1]=>
  array(3) {
    ["c_cat_id"]=>
    string(1) "1"
    ["c_title"]=>
    string(20) "Programas e projetos"
    ["pages"]=>
    array(2) {
      [0]=>
      array(2) {
        ["p_menu"]=>
        string(10) "PBA BR 163"
        ["p_page_id"]=>
        string(1) "1"
      }
      [1]=>
      array(2) {
        ["p_menu"]=>
        string(15) "Outros projetos"
        ["p_page_id"]=>
        string(1) "3"
      }
    }
  }
  [2]=>
  array(3) {
    ["c_cat_id"]=>
    string(1) "2"
    ["c_title"]=>
    string(11) "Another Cat"
    ["pages"]=>
    array(1) {
      [0]=>
      array(2) {
        ["p_menu"]=>
        string(15) "Outros projetos"
        ["p_page_id"]=>
        string(1) "4"
      }
    }
  }
}

0
投票

看起来您想要获取一个页面数组并将其转换为一个类别数组,每个类别都包含一个页面数组。

$inputArray = array(...); // whatever you have originally
$catArray = array();
foreach($inputArray as $page) {
  addToCatArray($page);
}

function addToCatArray($page) {
  $found = false;
  foreach($catArray as $cat) {
    if ($cat['c_cat_id'] == $page['c_cat_id'] {
      $newPage = array('p_page_id' => $page['p_page_id'], 'p_menu' => $page['p_menu']);
      $cat['pages'][] = $newPage;
      $found = true;
      break;
    }
  }
  if (!$found) { // create a new category
    $newCat = array('c_cat_id' => $page['c_cat_id'], 'c_title' => $page['c_title']);
    $newPage = array('p_page_id' => $page['p_page_id'], 'p_menu' => $page['p_menu']);
    $newCat['pages'] = array($newPage);
    $catArray[] = $newCat;
  }
}

0
投票
  • 当您迭代输入数组的每一行时,将数据拆分为两个数组——父级数据和子级数据。

    array_chunk()
    很简洁,适合这个问题,但其他场景可能需要不同的技术。

  • 检查之前是否遇到过分组标识符。如果没有,则创建一个新的引用变量,用所需的数组填充它,然后将其推入结果数组。如果已经遇到标识符,只需将子数据作为新子数组推送到适当的引用数组中即可。

  • 以这种方式使用引用可以避免在循环后重新索引结果数组

代码:(演示

$result = [];
foreach ($array as $row) {
    [$parent, $child] = array_chunk($row, 2, true);
    if (!isset($ref[$parent['c_cat_id']])) {
        $ref[$parent['c_cat_id']] = $parent + ['pages' => [$child]];
        $result[] =& $ref[$parent['c_cat_id']];
        continue;
    }
    $ref[$parent['c_cat_id']]['pages'][] = $child;
}

var_export($result);
© www.soinside.com 2019 - 2024. All rights reserved.