2009-12-22 1 views
-1

J'ai une table dans ma base de données qui jusqu'ici a été idéale pour stocker des éléments dans plusieurs objets. Mais je veux être capable de le transformer en un objet multi-objets.Impossible d'obtenir les clés d'une base de données à analyser dans le cadre d'un tableau

Voici les données qui est liée à ce nouveau « objet » (dans une base MySQL):

 
    uid  field    value 
    page:1 shop[2].location In Shops, Dundas Arcades,Middlesbrough, TS1 1HT 
    page:1 shop[1].location 5a High Street, Stockton-on-tees, TS18 1UB 
    page:1 name    Enter The Asylum 
    page:1 contact.website  http://entertheasylum.co.uk 
    page:1 contact.phone  0800 090 090 

Maintenant que je suis à la recherche est par PHP transformer en quelque chose comme (sortie print_r):

array(
    "name" => "Enter The Asylum", 
    "shop" => array(
     array("location" => "In Shops, Dundas Arcades..."), 
     array("location" => "5a High Street, Stockton-on-tees...") 
    ), 
    "contact" => array(
     "website" => "http://entertheasylum.co.uk", 
     "phone" => "0800 090 090" 
    ) 
) 

Avez-vous des idées?

+3

C'est un bon exemple de comment * ne pas * utiliser les bases de données relationnelles. :) –

+0

Dans ma configuration actuelle, c'est tout ce que je peux utiliser ... Je n'ai aucune idée sur la façon de le faire ... –

+0

Je dois demander, comment était-ce "génial" dans le passé? Vous brisez presque toute forme normale.Cela dit, vous pouvez utiliser des variables variables en PHP pour résoudre votre problème. Je ne suis pas positif cependant. – MindStalker

Répondre

0

J'ai réussi à le faire via regex et php. Voici la fonction magique (cela fait partie de mon code et d'autres choses):

function fetch_profile_info($id){ 
    $sql = "SELECT * FROM profile_info WHERE `uid`='".me($id)."'"; 
    $r = mysql_query($sql); 
    $profile = array(); 
    while($row = mysql_fetch_array($r)){ 
     /* new: process it into objects etc */ 
     $field = $row['field']; 
     $field = preg_replace('/\.([a-zA-Z]*)/i', "['$1']", $field); 
     $field = preg_replace('/^([a-zA-Z]*)/', "['$1']", $field); 
     eval("\$profile{$field} = \"".addslashes($row['value'])."\";"); 
    } 
    return $profile; 
} 

ça marche! Yay!

+1

"Si eval() est la réponse, vous posez presque certainement la mauvaise question." - Rasmus Lerdorf, BDFL de PHP – Dereleased

+0

bien c'est nécessaire dans ce code car il n'y a pas d'autre moyen que je pourrais obtenir ceci pour travailler ... pourquoi est eval() là de toute façon? –

1

Je ne peux pas vous aider avec le problème original, mais je vais vous suggérer un moyen approprié d'utiliser des bases de données relationnelles comme MySQL. Autrement dit, vous tables devriez avoir une structure comme celle-ci:

Tableau page:

  • id PK
  • Nom
  • téléphone
  • site

Table_location:

  • id PK(ce qui est techniquement pas nécessaire, mais plus agréable que d'avoir une clé primaire sur la position)
  • page_id FK(références page.id)
  • Position
  • emplacement

Les données ressembleraient alors à ceci.

Tableau page:

| id | name    | phone   | website      | 
| 1 | "Enter The Asylum" | "0800 090 090" | "http://entertheasylum.co.uk" | 

Tableau page_position:

| id | page_id | position | location           | 
| 1 | 1  | 1  | "5a High Street, Stockton-on-tees, TS18 1UB"  | 
| 2 | 1  | 2  | "In Shops, Dundas Arcades,Middlesbrough, TS1 1HT" | 

Et quelques lectures supplémentaires: Relational model

+0

ce n'est pas bon car je veux pouvoir facilement ajouter via le code de nouvelles parties (elles seront beaucoup plus dans la base de données, chacun avec des éléments différents, etc.) –

+0

@jos Simpson: Vous seriez surpris de voir à quel point ce type d'installation est puissant. Sauf si vous construisez une sorte de CMS (où la capacité des utilisateurs à définir de nouvelles informations est vaste) C'est probablement la voie à suivre. Surtout si vous pensez pouvoir traduire facilement les informations de la base de données dans un format que vous pouvez utiliser. – Guvante

+0

je ne veux pas comme 1000 tables juste pour ces objets ... je l'ai compris avec une belle regex :) –

Questions connexes