2010-07-01 6 views
3

Dans ma base de données, certains paramètres de champ sont sérialisés et stockés. Quand je fais cela:PHP Question - Comment créer un tableau sur une chaîne?

print_r(unserialized($r['settings'])); 

Je vais obtenir ceci:

Array ( 
[prefix] => 
[suffix] => 
[min] => 
[max] => 
[allowed_values] => 1|Common 2|Rare 3|Almost Extinct 
) 

Je suis en train de créer un tableau sur la base des valeurs pour allowed_values ​​comme ceci:

Array (
[1] => Common 
[2] => Rare 
[3] => Almost Extinct 
) 

Le le problème est, quand j'utilise exploser ("|", $ r ['allowed_values']), je reçois:

Array(
[0] => 1 
[1] => Common 2 
[2] => Rare 3 
[3] => Almost Extinct 
) 

Ce qui, c'est logique, mais évidemment pas ce que j'espérais ... Donc, je me demandais s'il y avait un moyen simple de faire ce que j'essaie ici? J'ai pensé à utiliser exploser plusieurs fois, une fois pour les espaces, et une fois pour les tuyaux, mais cela ne fonctionnera pas non plus à cause de l'espace dans "Presque Éteint" ...

+0

Vous devez poster plus de code, qui créez-vous initialement la chaîne? –

+0

À quoi voulez-vous que le tableau ressemble? – Joseph

+0

Vous devez modifier la configuration de votre base de données pour stocker ces paramètres dans des champs distincts. –

Répondre

3

essayez ceci:

$tab=array(); 
preg_match_all("/\s*(\d+)\|([^\d]+)/",$r['allowed_values'],$tab); 
print_r(array_combine($tab[1],$tab[2])); 

cela devrait faire l'affaire :)

+2

Sauf '(\ w +)' ne correspondra pas à 'Presque éteint'. Remplacez cela par '([^ \ d] +)' qui devrait faire l'affaire en supposant que les "valeurs" n'auront jamais de nombres dedans.Avec la regex fixe, cette réponse est la meilleure solution, car elle ne suppose pas que les nombres seront triés au plus bas et poussent aveuglément chaque valeur sur la fin d'un tableau – MooGoo

+0

édité la réponse pour prendre en compte le commentaire – dweeves

+0

J'aime cette méthode. – Mike

0

Je pense que cela devrait fonctionner. Ceci divise le premier nombre et le "|" carboniser

<?php 
$string = "1|Faruk 2|Test"; 
$array = preg_split('/\d/', $string, -1, PREG_SPLIT_NO_EMPTY); 
$content = explode("|", implode($array)); 

var_dump($content); 
?> 

Et voici le résultat

array(3) { 
    [0]=> 
    string(0) "" 
    [1]=> 
    string(6) "Faruk " 
    [2]=> 
    string(4) "Test" 
} 
2

Si les indices originaux ne sont pas séquentiels de 1 , et vous avez besoin de les garder tels qu'ils sont, voir dweeves répondre, car cela maintient les index et les valeurs liées ensemble corr ectly.

$string = unserialized($r['settings']['allowed_values']); 
//$string = '1|Common 2|Rare 3|Almost Extinct'; 

print_r (preg_split("/\d+\|/", $string, -1, PREG_SPLIT_NO_EMPTY)); 

Sorties:

Array 
(
    [0] => Common 
    [1] => Rare 
    [2] => Almost Extinct 
) 
+0

Il semble différent du tableau de la question (différentes clés). –

+0

Je viens d'utiliser la sortie de 'unserialized ($ r ['settings'] ['allowed_values'])' comme le contenu de '$ string'. J'ai clarifié cela maintenant. – Mike

0

J'utiliser une expression régulière pour correspondre au modèle de chaque entrée, mais capturer seulement le texte d'intérêt. En utilisant preg_match_all(...), l'objet $match est rempli avec des sous-tableaux des groupes de capture.

$input = '1|Common 2|Rare 3|Almost Extinct'; 
preg_match_all('/\d+\|([^\d]+)/',$input, $match); 
print_r($match[1]); 

Produit:

Notez que si vous êtes étiquettes utiliser des numéros, vous aurez besoin de modifier l'expression régulière.

Cette méthode vous permet également de capturer le nombre et de créer votre propre tableau ordonné, si les valeurs stockées dans vos tables peuvent être hors service.