Kom ihåg mig?
Home Menu

Menu


Gruppera kategorier och items i array

Ämnesverktyg Visningsalternativ
Oläst 2013-03-02, 19:05 #1
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
Standard Gruppera kategorier och items i array

Jag har 2 tabbeller som håller kategorigrupper och kategorier. Dessa ser ut såhär: http://i.imgur.com/H8faLT1.png och http://i.imgur.com/p5S9fQD.png.

Nu vill jag hämta allting och presentera detta såhär men jag har ingen aning om hur jag ska göra detta. Det är liksom en kvadrupel array och jag har aldrig hållt på med detta.

PHP-kod:
$categories = array(
    array(
        
"group_id" => 1,
        
"group_name" => "Fordon",
        
"categories" => array(
            array(
                
"category_id" => 1,
                
"category_name" => "Bilar"
            
),
            array(
                
"category_id" => 2,
                
"category_name" => "Bildelar"
            
),
            array(
                
"category_id" => 3,
                
"category_name" => "Båtar"
            
),
            array(
                
"category_id" => 4,
                
"category_name" => "Båtdelar"
            
)
        )
    ),    
    array(
        
"group_id" => 2,
        
"group_name" => "Elektronik",
        
"categories" => array(
            array(
                
"category_id" => 5,
                
"category_name" => "Datorer"
            
),
            array(
                
"category_id" => 6,
                
"category_name" => "Musik"
            
),
            array(
                
"category_id" => 7,
                
"category_name" => "Ljud"
            
),
            array(
                
"category_id" => 8,
                
"category_name" => "Bild"
            
)
        )
    )
); 
Värt att tillägga är att jag gör lite utav en blocketkopia.
secag är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-03-02, 19:24 #2
pelmereds avatar
pelmered pelmered är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: May 2010
Inlägg: 1 342
pelmered pelmered är inte uppkopplad
Har WN som tidsfördriv
pelmereds avatar
 
Reg.datum: May 2010
Inlägg: 1 342
Det är väl bara att göra något i stil med (obs helt otestad kod):

PHP-kod:
$cur_group_id NULL;

$categories  = array();

$group_i 0;

while( 
$r next_result() )
{
    if( 
$r->group_id != $cur_group_id )
    { 
//Börja ny gruppering
        
        //Increment array position
        
$group_i++;
        
        
$categories[$group_i]['group_id'] = $r->group_id;
        
$categories[$group_i]['group_name'] = $r->group_name;
    }
    
    
//Fyll på med kategorier
    
$categories[$group_i]['categories'] = array(
        
"category_id" => $r->category_name,
        
"category_name" => $r->category_name;
    )

I SQL-queryn kör du mot category-tabellen och joinar in groups-tabellen. Sedan grupperar(GROUP BY) på category_id.

Ändra while-loopen så att det blir rätt för det databas-API du använder.

Senast redigerad av pelmered den 2013-03-02 klockan 19:27 Anledning: Bytte variabelnamn för att passa bättre med frågan
pelmered är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-03-02, 20:03 #3
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
Tack! Fick det att funka med detta:
PHP-kod:
$result $db->query("SELECT categories.*, category_groups.category_group_name AS category_group_name FROM `categories` JOIN `category_groups` ON category_groups.category_group_id = categories.category_group GROUP BY category_id") or die($db->error);
    
$categories = array();
    
$group_i = -1;
    
$current_group_id NULL;
    while(
$row $result->fetch_array(MYSQL_ASSOC)) {
        if(
$current_group_id != $row["category_group"]) {
            
$current_group_id $row["category_group"];
            
$group_i++;
            
$categories[$group_i]["group_id"] = $row["category_group"];
            
$categories[$group_i]["group_id"] = $row["category_group_name"];
        }
        
$categories[$group_i]["categories"][] = array(
            
"category_id" => $row["category_id"],
            
"category_name" => $row["category_name"]
        );
    } 
Jag har en följdfråga:
Om man nu är inne på olika kategorier så vill man kunna välja egenskaper för vad man är inne på. Typ om man är på Båtar. då får man välja, Stor liten ful snygg båt.
Och om man är på datorer får man välja: laptop, stationär osv...

Eftersom alla egenskaper skiljer sig åt så måste man väl kolla med IF om man är på kategorin och sen visa diverse egenskaper & filter? Kolla bara på BILAR och BÅTAR på Blocket.

Senast redigerad av secag den 2013-03-02 klockan 20:07
secag är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-03-03, 01:13 #4
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Ang frågan om hur du kan lagra olika egenskaper per kategori så kan du lösa det på det här sättet i SQL:

Jag har först lagt upp en databas som heter `wn`. Lägger SQL och DDL i detta inlägg, sen får vi ta kommentarer i separat inlägg.

För att Radera strukturen:
Kod:
USE `wn`;

drop table wn.property_int;
drop table wn.article;
drop table wn.property_group;
drop table wn.category;
drop table wn.category_group;

För att skapa strukturen med DDL-script:
Kod:
USE `wn`;

delimiter $$


CREATE TABLE `category_group` (
  `category_group_id` int(11) NOT NULL,
  `category_group_name` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`category_group_id`)
) ENGINE=InnoDB $$



CREATE TABLE `category` (
  `category_id` int(11) NOT NULL,
  `category_group` int(11) DEFAULT NULL,
  `category_name` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`category_id`),
  KEY `category_category_group_idx` (`category_group`),
  CONSTRAINT `category_category_group` FOREIGN KEY (`category_group`) REFERENCES `category_group` (`category_group_id`)
) ENGINE=InnoDB $$


CREATE TABLE `article` (
  `article_id` int(11) NOT NULL,
  `category_id` int(11) DEFAULT NULL,
  `article_name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`article_id`),
  KEY `article_category_idx` (`category_id`),
  CONSTRAINT `article_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`category_id`)
) ENGINE=InnoDB $$



CREATE TABLE `property_group` (
  `category_id` int(11) NOT NULL,
  `property_group_name` varchar(30) NOT NULL,
  PRIMARY KEY (`category_id`,`property_group_name`),
  KEY `property_group_category_idx` (`category_id`),
  CONSTRAINT `property_group_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`category_id`)
) ENGINE=InnoDB $$



CREATE TABLE `property_int` (
  `prop_article_id` int(11) NOT NULL,
  `prop_category_id` int(11) NOT NULL,
  `prop_gr_name` varchar(30) NOT NULL,
  `property_int_value` int(11) DEFAULT NULL,
  PRIMARY KEY (`prop_article_id`,`prop_category_id`,`prop_gr_name`),
  KEY `prop_article_idx` (`prop_article_id`),
  KEY `prop_cat_idx` (`prop_category_id`,`prop_gr_name`),
  CONSTRAINT `prop_article` FOREIGN KEY (`prop_article_id`) REFERENCES `article` (`article_id`),
  CONSTRAINT `prop_cat_gr` FOREIGN KEY (`prop_category_id`, `prop_gr_name`) REFERENCES `property_group` (`category_id`, `property_group_name`)
) ENGINE=InnoDB
$$

DELIMITER ;

DROP procedure IF EXISTS `FillProperty`;



DELIMITER $$

USE `wn`$$

CREATE PROCEDURE `wn`.`FillProperty` ()

BEGIN

	INSERT IGNORE wn.property_int (prop_article_id, prop_category_id, prop_gr_name)

	select a.article_id, pg.category_id, pg.property_group_name 

	from wn.property_group pg, wn.article a

	where a.category_id = pg.category_id;



END



$$

DELIMITER ;
För att addera lite testdata:
Kod:
/*
-- Query: SELECT * FROM wn.category_group
LIMIT 0, 1000

-- Date: 2013-03-03 00:10
*/
INSERT IGNORE `category_group` (`category_group_id`,`category_group_name`) VALUES (1,'Fordon');
INSERT IGNORE `category_group` (`category_group_id`,`category_group_name`) VALUES (2,'Elektronik');



/*
-- Query: SELECT * FROM wn.category
LIMIT 0, 1000

-- Date: 2013-03-03 00:20
*/
INSERT IGNORE `category` (`category_id`,`category_group`,`category_name`) VALUES (1,1,'Bilar');
INSERT IGNORE `category` (`category_id`,`category_group`,`category_name`) VALUES (2,1,'Bildelar');
INSERT IGNORE `category` (`category_id`,`category_group`,`category_name`) VALUES (3,1,'Båtar');
INSERT IGNORE `category` (`category_id`,`category_group`,`category_name`) VALUES (4,1,'Båtdelar');
INSERT IGNORE `category` (`category_id`,`category_group`,`category_name`) VALUES (5,2,'Datorer');
INSERT IGNORE `category` (`category_id`,`category_group`,`category_name`) VALUES (6,2,'Musik');
INSERT IGNORE `category` (`category_id`,`category_group`,`category_name`) VALUES (7,2,'Ljud');
INSERT IGNORE `category` (`category_id`,`category_group`,`category_name`) VALUES (8,2,'Bild');




/*
-- Query: SELECT * FROM wn.property_group
LIMIT 0, 1000

-- Date: 2013-03-03 00:14
*/
INSERT IGNORE `property_group` (`category_id`,`property_group_name`) VALUES (1,'Mätarställning');
INSERT IGNORE `property_group` (`category_id`,`property_group_name`) VALUES (1,'Tjänstevikt (Kg)');
INSERT IGNORE `property_group` (`category_id`,`property_group_name`) VALUES (1,'Årsmodell');
INSERT IGNORE `property_group` (`category_id`,`property_group_name`) VALUES (5,'Antal kärnor (CPU)');
INSERT IGNORE `property_group` (`category_id`,`property_group_name`) VALUES (5,'CPU Hastighet (Mhz)');
INSERT IGNORE `property_group` (`category_id`,`property_group_name`) VALUES (5,'Installerat Primärminne (MB)');
INSERT IGNORE `property_group` (`category_id`,`property_group_name`) VALUES (5,'Maximalt Primärminne (MB)');



/*
-- Query: SELECT * FROM wn.article
LIMIT 0, 1000

-- Date: 2013-03-03 00:26
*/
INSERT IGNORE `article` (`article_id`,`category_id`,`article_name`) VALUES (1,1,'Volvo V70');
INSERT IGNORE `article` (`article_id`,`category_id`,`article_name`) VALUES (2,5,'DELL Latitude');
INSERT IGNORE `article` (`article_id`,`category_id`,`article_name`) VALUES (3,2,'Kofångare');
INSERT IGNORE `article` (`article_id`,`category_id`,`article_name`) VALUES (4,2,'Fälgkors');
INSERT IGNORE `article` (`article_id`,`category_id`,`article_name`) VALUES (5,3,'Coronet Master');
INSERT IGNORE `article` (`article_id`,`category_id`,`article_name`) VALUES (6,4,'Rodersprint');
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 17:10.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017