2013-03-31 4 views
0

У меня есть такой массив, как я могу разбить его на несколько других массивов на основе идентификатора категории?Как сортировать массив в отдельные массивы на основе неизвестных ключей?

т.е. есть категория 1 -> Форум 1, форум 4. категория 2 -> Форум 3, форум 7

Я посмотрел на array_chunk, но может быть любое количество категорий и форумов

Array 
(
    [category_id] => 1 
    [category_name] => Main 
    [forum_id] => 1 
    [forum_name] => General forum 
) 
Array 
(
    [category_id] => 1 
    [category_name] => Main 
    [forum_id] => 2 
    [forum_name] => Test forum 
) 
Array 
(
    [category_id] => 2 
    [category_name] => Test 
    [forum_id] => 3 
    [forum_name] => Another test 
) 

Я использую этот SQL запрос (упаковывают это может быть сделано с SQL только перед изменением с PHP)

$forums_query = mysqli_query($sql_connect, 'SELECT `categories`.`category_id`, `categories`.`category_name`, 
              `forums`.`forum_id`, `forums`.`forum_name`, `forums`.`category_id` 
              FROM `categories` 
               LEFT JOIN `forums` 
                ON `categories`.`category_id` = `forums`.`category_id` 
              ORDER BY `categories`.`category_position`, `forums`.`forum_position` ASC'); 

Edit: кстати, я могу думать так, чтобы это сделать, что петля gh it и для каждого идентификатора cat (как X), проверьте, существует ли массив с именем catX, и если его не создать

Однако это будет выполняться каждый раз, когда кто-то посещает страницу, поэтому я хочу, чтобы это было так же быстро и свет на ресурсы, как это возможно

ответ

2

Я не уверен, если я получаю это право, посмотрите на эту демо:

<?php 
$forums[] = array('category_id' => 1, 'category_name' => 'Main', 'forum_id' => 1, 'forum_name' => 'General forum'); 
$forums[] = array('category_id' => 1, 'category_name' => 'Main', 'forum_id' => 2, 'forum_name' => 'General 2'); 
$forums[] = array('category_id' => 1, 'category_name' => 'Main', 'forum_id' => 3, 'forum_name' => 'General 3'); 
$forums[] = array('category_id' => 1, 'category_name' => 'Main', 'forum_id' => 4, 'forum_name' => 'General 4'); 
$forums[] = array('category_id' => 2, 'category_name' => 'Main2', 'forum_id' => 1, 'forum_name' => 'General forum'); 
$forums[] = array('category_id' => 2, 'category_name' => 'Main2', 'forum_id' => 2, 'forum_name' => 'General 2'); 
$forums[] = array('category_id' => 3, 'category_name' => 'Main3', 'forum_id' => 3, 'forum_name' => 'General 3'); 
$forums[] = array('category_id' => 4, 'category_name' => 'Main3', 'forum_id' => 4, 'forum_name' => 'General 4'); 


$forums_organized = array(); 
foreach($forums as $forum){ 
    $forums_organized[$forum['category_id']][] = array('forum_name' => $forum['forum_name'], 'forum_id' => $forum['forum_id']); 
} 
print_r($forums_organized); 

выход:

Array 
(
    [1] => Array 
     (
      [0] => Array 
       (
        [forum_name] => General forum 
        [forum_id] => 1 
       ) 

      [1] => Array 
       (
        [forum_name] => General 2 
        [forum_id] => 2 
       ) 

      [2] => Array 
       (
        [forum_name] => General 3 
        [forum_id] => 3 
       ) 

      [3] => Array 
       (
        [forum_name] => General 4 
        [forum_id] => 4 
       ) 

     ) 

    [2] => Array 
     (
      [0] => Array 
       (
        [forum_name] => General forum 
        [forum_id] => 1 
       ) 

      [1] => Array 
       (
        [forum_name] => General 2 
        [forum_id] => 2 
       ) 

     ) 

    [3] => Array 
     (
      [0] => Array 
       (
        [forum_name] => General 3 
        [forum_id] => 3 
       ) 

     ) 

    [4] => Array 
     (
      [0] => Array 
       (
        [forum_name] => General 4 
        [forum_id] => 4 
       ) 

     ) 

) 
+0

Отлично. благодаря – cantsay

0

не так INNER JOIN в ваш случай?!

$old_array = array(); 
$new_array = array(); 

foreach($old_array AS $tab) { 
    if(!array_key_exists($tab['category_name'], $new_array)) { 
     $tmp = array($tab['forum_name']); 
     $tmp = array($tab['category_name']=>$tmp); 
     $new_array = array_merge($new_array, $tmp); 
    } 
    else { 
     array_push($new_array[$tab['category_name']], $tab['forum_name']); 
    } 
} 
Смежные вопросы