2009-08-31 20 views
-2

J'ai une chaîne comme ceci:Mettez la chaîne dans un tableau multidimensionnel et trier puis par sous-valeur dans le tableau

nom de l'événement | Description de l'événement | type d'événement | date de l'événement | heure de l'événement | détails de l'événement,
nom de l'événement | description de l'événement | type de l'événement | date de l'événement | heure de l'événement | détails de l'événement,
nom de l'événement | description de l'événement | type de l'événement | événement date | heure de l'événement | détails de l'événement | date | heure de l'événement | détails de l'événement,

Tout est dans une chaîne. J'ai besoin de le transformer en tableau, de le trier de nouveau par date d'événement, puis de le réintégrer dans une chaîne.

Toute aide est appréciée. Merci beaucoup.

Répondre

0
<?php 
$string = "event name|event description|event type|2009-08-01|event time|event details, 
event name|event description|event type|2009-08-02|event time|event details, 
event name|event description|event type|2009-08-01|event time|event details, 
event name|event description|event type|2009-08-03|event time|event details,"; 
    $arr = array(); 
    $strs = explode(',', $string); 
    print_r($strs); 
    foreach ($strs as $i => $str) 
    { 
     if (empty($str)) continue; 

     $expl = explode('|', $str); 
     $arr[strtotime($expl[3]) . $i] = $str; 
    } 
    ksort($arr); 
    $result = implode(",\n", $arr); 
    print_r($result); 
?> 

sortie:

event name|event description|event type|2009-08-01|event time|event details, 
event name|event description|event type|2009-08-01|event time|event details, 
event name|event description|event type|2009-08-02|event time|event details, 
event name|event description|event type|2009-08-03|event time|event details 
+0

une seule boucle :) – inakiabt

+0

Merci beaucoup! Cela fonctionne parfaitement pour moi. J'avais besoin d'ajouter une virgule à la fin de $ result = implode (", \ n", $ arr); comme ceci: $ result = implode (", \ n", $ arr). ','; Autre alors, parfait. –

+0

Je suis content que vous l'aimiez – inakiabt

1

Vous allez d'abord vouloir scinder la chaîne en lignes, la diviser en sous-matrices, la lancer via usort, puis la relier tous ensemble. Par exemple:

function lineSplit(&$item) 
{ 
    $item = explode('|', $item); 
} 

function lineSort($item1, $item2) 
{ 
    return strcmp($item1[ 3 ], $item2[ 3 ]); 
} 

function lineJoin(&$item) 
{ 
    $item = join('|', $item); 
} 

$str = '...'; 

// First split on the comma to get each line. 
$lines = explode(",\n", $str); 

// Now split each line into subarrays 
array_walk($lines, 'lineSplit'); 

// Perform the sort using a user-defined function. 
usort($lines, 'lineSort'); 

// Now join the subarrays into strings. 
array_walk($lines, 'lineJoin'); 

// And finally merge the lines again. 
$str = join(",\n", $lines); 
2
function sortStringByDate($str) 
{ 
    $arr = explode(",\n", $str); 
    foreach ($arr as $key => $val) 
    { 
     $arr[$key] = explode('|', $val); 
    } 
    $new_arr = array(); 
    foreach ($arr as $i => $vals) 
    { 
     $time = strtotime($vals[3].' '.$vals[4]); 
     $new_arr[$time] = $vals; 
    } 
    ksort($new_arr); 

    foreach ($new_arr as $key => $value) 
    { 
     $almost[] = implode('|', $value); 
    } 

    return implode(",\n", $almost); 
} 
0
$arr = explode(',', $inputString); 
$map = array() 
foreach ($arr as $line){ 
    $lineArray = explode('|', $line); 
    // convert date value to numerical representation of date+time 
    $lineArray[3] = ... 
    $map[] = $lineArray; 
} 

array_multisort($map[, ...]); 

$result = array() 
foreach($map as $lineArray){ 
    $result[] = implode('|', $lineArray); 
} 

// the resulting string: 
implode(',', $result) 
+0

Attention, cela ne fonctionnera pas si l'un des champs contient des virgules. –

Questions connexes