2017-05-15 2 views
-3

je la chaîne suivante:PHP - Scinde une chaîne en lignes pour insérer

$ string = John Smith - clearner - 1234 $ Bob Dillan - Man IT - 2.453.242 $ Sarah Clifford - Admin - 32423423

I besoin de diviser chaque nom de personnes, profession, numéro d'enregistrement en 3 colonnes séparées dans MySQL, chaque personne est séparé par « $ »

résultat souhaité:

Col1 | Col2 | Col3

John Smith | Clearner | 1234

Bob Dillan | IT Man | 2453242

Sarah Clifford | Admin | 32423423

Maintenant, je crois que nous devons faire exploser la chaîne deux fois par « $ » et « - »

J'ai réussi à diviser « $ » en procédant comme suit:

$peeps = explode("$", $string); 
foreach($peeps as $peep) { 
$persons .= $peep; 
} 
$pnames = explode(' - ',$persons); 

MAIS JE « m un débutant complet en matière de l'explosion et les boucles foreach

Toute aide serait étonnant

+0

Avez-vous un code que vous pouvez partager ce que vous avez essayé jusqu'à présent? – Optimae

+0

Vous devez freiner votre chaîne et après cela | pour diffrence – sunil

+0

double possible de [Double exploser un tableau] (http://stackoverflow.com/questions/16576545/double-explode-an-array) –

Répondre

0

Compte tenu de votre chaîne, vous pouvez le modifier de manière simple avec array_map

$string="John Smith - Clearner - 1234$Bob Dillan - IT Man - 2453242$Sarah Clifford - Admin - 32423423" 

Si foreach est trop difficile à saisir, que vous devez modifier le tableau que vous déplacement, essayez l'approche fonctionnelle , peut-être que cela vous simplifiera la tâche.

explode, comme vous le savez créer un tableau divisant la chaîne d'entrée avec un séparateur:

$partial= explode("$", $string); 

se traduira par

$partial= [ 
    "John Smith - Clearner - 1234", 
    "Bob Dillan - IT Man - 245324", 
    "Sarah Clifford - Admin - 32423423" 
]; 

vous pouvez appliquer la même transformation à chaque élément d'un tableau avec array_map. La transformation est codée dans une fonction d'assistance:

function detail_splitter($string) { 
    return explode(" - ", $string) 
} 

qui peut être mis à profit en tant

$result =array_map(detail_splitter, $partial); 

et le résultat sera le suivant:

$result = [ 
    ["John Smith", "Clearner", "1234"], 
    ["Bob Dillan", "IT Man", "245324"], 
    ["Sarah Clifford", "Admin", "32423423"] 
]; 

qui est un tableau de matrice. Chaque élément du tableau est traité par la fonction d'assistance et divisé en un tableau à trois éléments. Le résultat est utilisé pour créer un nouveau tableau avec les valeurs traitées prêtes à être traitées.

Évidemment, vous pouvez combiner les étapes en une seule instruction:

$result = array_map( 
    function ($p) { return explode(" - ", $p); }, 
    explode("$", $string); 
); 

Depuis maintenant, vous ne devez pas transformer le tableau plus loin, mais une tâche pour chaque élément de tableau, vous pouvez revenir à foreach. Notez que j'ai changé le nom du paramètre de $string à $p pour éviter de perturber la portée (pour php, tout ira bien, les programmeurs humains ne sont parfois pas à l'aise avec les noms de variable d'observation).

Il y a une fonction, array_walk pour effectuer une tâche sur tous les éléments d'un tableau, mais je pense que cette tâche serait plus facile à l'aide d'un foreach simple.

Vous pouvez adresser les différentes personnes de telle manière:

// $dbc is your db connection 
$sql = "INSERT INTO yourtable VALUES (?,?,?); 
foreach($result as $person) { 
    $stmt = $dbc->prepare($sql); 
    $stmt->bind_param('s', $person[0]); 
    $stmt->bind_param('s', $person[1]); 
    $stmt->bind_param('s', $person[2]); 
    $stmt->execute(); 
} 

J'ai fait une hypothèse avec votre instruction SQL, mais MySQL utilise hors de la portée de cette question, je suppose.

+0

Ce fait le travail! merci beaucoup d'avoir pris le temps d'aider! tout est allé au plan! Je dois utiliser des déclarations préparées donc cela s'est parfaitement intégré! – memaxt

-2

je ferais cela dans MySQL

UPDATE [table] 
SET 
[col1] = SPLIT_STR([col], '$', 1), 
[col2] = SPLIT_STR([col], '$', 2), 
[col3] = SPLIT_STR([col], '$', 3); 
+0

Il n'est pas le comportement exigent, qui est juste la première partie de la procédure, et peut induire en erreur, expecially pour un débutant comme indiqué dans la question – Eineki

0

Essayez

`$person_array = array(); $i=0; 

$peeps = explode("$", $string); 

foreach ($peeps as $peep) { 
$persons = explode("-", $string); 

foreach ($persons as $person) { 

$person[$i]['name'] = $person[0]; 
$person[$i]['occupation'] = $person[1]; 
$person[$i]['number'] = $person[2]; 
$i++; 

} // inner each loop 

} // Outer each loop`