2017-04-21 2 views
0

Alors j'utilise la chose suivante:array_walk -> array numérique devient mots

<?php 
$string='JUD. NEAMT, SAT ROMEDC ALEXANDRE COM. COMENKA, STR. EXAMMS RANTEM, NR.6'; 
$result=preg_split("/(?:JUD.\s*|\s*SAT\s*|\s*COM\.\s*|\s*STR.\s*|\s*SECTOR\s*|\s*B-DUL\s*|\s*NR\.\s*|\s*ET.\s*|\s*MUN\.\s*|\s*BL.\s*|\s*SC\.\s*|\s*AP\.\s*)/", $string); 

array_walk($result,function($value,$key) use (&$result){ 
    if(stristr($value, ",")) 
    { 
     $result[$key]=explode(",", $value)[0]; 
    } 
}); 
print_r(array_filter($result)); 

la sortie serait:

Array 
(
    [1] => NEAMT 
    [2] => ROMEDC ALEXANDRE 
    [3] => COMENKA 
    [4] => EXAMMS RANTEM 
    [5] => 6 
) 

Le principal problème est que $ string est différent à chaque fois et peut contenir différents paramètres comme 'SAT' pourrait simplement ne pas apparaître dans une autre chaîne, car il est remplacé par 'SECTOR'.

Tous ces mots sont des mots de localisation comme le numéro de la maison ('NR.') Ou le nom de la ville ('JUD').

Ce que je veux est de convertir le tableau ci-dessus en quelque chose comme ceci:

 Array 
(
    ['JUD'] => NEAMT 
    ['SAT'] => ROMEDC ALEXANDRE 
    ['COM'] => COMENKA 
    ['STR'] => EXAMMS RANTEM 
    ['NR'] => 6 
) 

J'espère que vous avez l'idée:

Je reçois d'une chaîne « adresse » différents paramètres comme appartement nombre, numéro de bâtiment et ainsi de suite (cela dépend de chaque fois sur le client - il peut vivre dans une maison donc il n'y a pas de numéro d'appartement), donc avoir des mots au lieu de chiffres dans le tableau.

Toute idée est la bienvenue.

Merci.

Répondre

1
$string='JUD. NEAMT, SAT ROMEDC ALEXANDRE COM. COMENKA, STR. EXAMMS RANTEM, NR.6'; 

//fix missing commas 
$string = preg_replace('#([A-Z]+) ([A-Z]+\.)#',"$1, $2",$string); 
//a trick to fix non space on `NR.6` 
$string = str_replace(['.',' '],['. ',' '],$string); 
//get the part seperated by comma, trim to remove spaces 
$ex = array_map('trim',explode(',',$string)); 
//iterate over it 
foreach($ex as $e){ 
    //explode the part by space 
    $new = array_map('trim',explode(' ',$e)); 
    //take the first part as key, remove spaces and dot 
    $key = trim(array_shift($new),' . '); 
    //collect via key and implode rest with a space 
    $coll[$key]=implode(' ',$new); 
} 
//done 
print_r($coll); 

Résultat:

Array 
(
    [JUD] => NEAMT 
    [SAT] => ROMEDC ALEXANDRE 
    [COM] => COMENKA 
    [STR] => EXAMMS RANTEM 
    [NR] => 6 
) 

une voie rapide à Rome ...

+0

Votre code fonctionne presque. Je rencontre des problèmes ici: https://eval.in/780354. COM. Devrait être une autre valeur de tableau avec la valeur = COMENKA. Pareil avec NR. -> 6 – an4rei

+0

@ an4rei Ceci est plus simple que votre code, alors mettez-le à jour selon vos besoins. Il est difficile de détecter la bonne chose dans la chaîne. Règles que j'ai en tête: 1. toutes les entrées doivent être séparées par une virgule. 2. La première partie d'une sous-chaîne peut être utilisée comme clé. Si les règles sont fausses, faites de nouveau et codez la logique. Mais restez simple :-) 'NR.6' est corrigé,' COM.' a besoin d'un comme ', COM'. – JustOnUnderMillions

+0

Merci beaucoup pour tout ça. Si je ne suis pas capable de modifier la chaîne de quelque façon que ce soit. Comment pourrais-je ajouter une virgule avant 'COM'? – an4rei