2010-01-17 6 views
0

J'utilise un api pour récupérer des données à partir d'un autre serveur les données renvoyées est quelque chose comme ceci:Chaîne à tableau sans exploser

accountid=10110 type=prem servertime=1263752255 validuntil=1266163393 
username= curfiles=11 curspace=188374868 bodkb=5000000 premkbleft=24875313 

Ceci est une chaîne tout je besoin de deux valeurs de chaîne entière, je suis Actuellement, j'utilise preg_match pour l'obtenir, mais juste pour en savoir plus et améliorer mon codage, existe-t-il une autre manière ou fonction dans laquelle toutes les valeurs sont automatiquement converties en tableau?

Merci.

Répondre

0

L'utilisation d'exploser est le plus rapide pour cela, peu importe quoi. Cependant, pour répondre à votre question, vous pouvez le faire de plusieurs façons. Mais juste parce que vous pouvez, ne signifie pas que vous devriez. Mais si vous voulez vraiment le rendre bizarre, essayez ceci.

utilisant strpos MIS À JOUR

$arr = array(); 
$begin = 0; 
$str = trim($str); # remove leading and trailing whitespace 
while ($end = strpos($str, ' ', $begin)) { 
    $split = strpos($str, '=', $begin); 
    if ($split > $end) break; 
    $arr[substr($str, $begin, $split-$begin)] = substr($str, $split+1, $end-$split-1); 
    $begin = $end+1; 
} 
+0

Quelle est cette itération manuelle à travers une chaîne? Strpos pourrait être plus énigmatique, mais c'est une gazillion fois plus rapide. – zneak

+0

Une chose garde l'habitude d'assigner des valeurs à une variable, parce que je vais vérifier strlen chaque fois qu'il boucle – Shishant

+0

J'essaie d'imprimer et r echo $ arr mais aucune valeur imprimée juste Array() – Shishant

0

essayer parse_str peut-être que vous devez faire str_replace(' ', '&', $string); avant

+0

Ne fonctionne pas. 'parse_str' (pas pars-str) attend des esperluettes comme séparateurs de valeurs-clés. – zneak

+2

bien c'est pourquoi il a besoin de str_replace() – antpaw

+1

Ce n'était pas là quand j'ai commenté. (Et ça va échouer si ses chaînes d'utilisateur peuvent contenir des esperluettes.) – zneak

1

Sooo, mon plus rapide que prévu preg_split, fonction basée strpos-ressemble à ceci:

function unpack_server_data($serverData) 
{ 
    $output = array(); 
    $keyStart = 0; 
    $keepParsing = true; 

    do 
    { 
     $keyEnd = strpos($serverData, '=', $keyStart); 
     $valueStart = $keyEnd + 1; 
     $valueEnd = strpos($serverData, ' ', $valueStart); 
     if($valueEnd === false) 
     { 
      $valueEnd = strlen($serverData); 
      $keepParsing = false; 
     } 

     $key = substr($serverData, $keyStart, $keyEnd - $keyStart); 
     $value = substr($serverData, $valueStart, $valueEnd - $valueStart); 
     $output[$key] = $value; 

     $keyStart = $valueEnd + 1; 
    } 
    while($keepParsing); 

    return $output; 
} 

Il recherche un caractère égal, recherche alors un caractère espace, et utilise ces deux pour décider où un nom de clé commence, et quand un nom de valeur commence.

+0

Votre fonction a une erreur seulement La 1ère valeur de la chaîne est convertie en clé. – Shishant

+0

J'ai essayé avec la corde que vous nous avez fournie et cela donne de bons résultats. Avez-vous testé avec cette chaîne aussi? Si vous ne l'avez pas fait, pouvez-vous poster celui que vous avez utilisé? – zneak

Questions connexes