Как мне массив выдвинуть этот 2-D массив?(PHP) - PullRequest
1 голос
/ 21 июня 2010

В этой модели codeigniter я пытаюсь выдвинуть название категории каждого продукта.Я хочу, чтобы массив выглядел следующим образом:

    Array
(
    [0] => Array
        (
        [id] => 1
        [name] => Game 1!
        [category_id] => 3
        [category] => games //the category element is in the [0] array.
    )

    [1] => Array
        (
            [id] => 2
            [name] => Game 2
            [category_id] => 3
            [category] => games
        )

вот как массив выглядит прямо сейчас:

Array
(
    [0] => Array
        (
            [category] => games //i want this to be in the [1] array
        )

    [1] => Array
        (
        [id] => 1
        [name] => Game 1!
        [category_id] => 3
    )

[2] => Array
    (
        [category] => games
    )

[3] => Array
    (
        [id] => 2
        [name] => Game 2
        [category_id] => 3
    )

вот моя функция, которая получает все продукты и помещает их в массив.

function getAllProducts(){
    $data=array();
    $Q=$this->db->get('products');
    if($Q->num_rows() > 0){
        foreach($Q->result_array() as $row){
            $Q2=$this->db->query("select name FROM categories 
            where id={$row['category_id']}");
            if($Q2->num_rows() > 0){
                foreach($Q2->result_array() as $row2){
                    //Trouble Here: dont know how to push this into the array.
                    //is there a function that i can put in the $data[___] 
                    //area so that it knows it is in the [0] element, then [1],etc?
                    $data[]['category']=$row2['name'];  
                }

            }    
            $data[]=$row;
        }
    }
    $Q->free_result();
    return $data;
}

Ответы [ 2 ]

3 голосов
/ 22 июня 2010

Либо сделать:

foreach($Q->result_array() as $key=>$row){
        $data[$key]=$row;
        $Q2=$this->db->query("select name FROM categories 
        where id={$row['category_id']}");
        if($Q2->num_rows() > 0){
            foreach($Q2->result_array() as $row2){
                $data[$key]['category']=$row2['name'];  
            }

        }    

    }

или даже лучше, сделайте правильный запрос:

function getAllProducts(){
    $data=array();
    $Q=$this->db->query("SELECT p.*, c.name as category FROM products p, LEFT JOIN categories c  ON c.id=p.category_id");
    if($Q->num_rows() > 0){
        foreach($Q->result_array() as $row){
             $data[] = $row;
        }
    }
    $Q->free_result(); // <- needed here? don't know
    return $data;
}

Я не знаю CodeIgniter, поэтому я не знаю, полностью ли это правильно. Но в целом это намного лучше, так как вы уменьшаете количество обращений к БД, которое всегда хорошо.
Таким образом, у вас есть только один запрос вместо n+1, если у вас есть n продуктов.

P.S .: Бьюсь об заклад, CodeIgniter также предоставляет некоторые API для создания JOIN. Прочитайте документацию .

Я только что увидел, что вы можете сделать это:

$this->db->select('*');
$this->db->from('products');
$this->db->join('categories', 'categories.id = products.category_id', 'left');

$Q = $this->db->get();

Используйте API.

1 голос
/ 22 июня 2010

Я бы попробовал другой подход, который уменьшает общее количество запросов, которое вам нужно сделать.

$productRows = getAllProducts();
$categoryRows = getAllCategories();

$categoriesById = array();

foreach ($categoryRows as $categoryRow) {

    $categoriesById[$categoryRow['id']] = $categoryRow;
}

$productsWithCategory = array();

foreach ($productRows as $productRow) {

    $categoryId = $productRow['category_id'];
    $productsWithCategory[] = array(
                 'id' => $productRow['id'],
               'name' => $productRow['name'],
        'category_id' => $categoryId,
           'category' => $categoriesById[$categoryId]['name']
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...