2009-08-13 16 views
5

मैं प्रत्येक तीसरे अर्धविराम (;) को एक टुकड़े के रूप में कैसे विस्फोट कर सकता हूं?php चरित्र के हर तीसरे उदाहरण को विस्फोट

उदाहरण डेटा: $ स्ट्रिंग = टुकड़ा 1; टुकड़ा 2; टुकड़ा 3; टुकड़ा 4; टुकड़ा 5; टुकड़ा 6; टुकड़ा 7; टुकड़ा 8;

उदाहरण उत्पादन होगा:

$output[0] = piece1;piece2:piece3; 

$output[1] = piece4;piece5;piece6; 

$output[2] = piece7;piece8; 

धन्यवाद!

+0

+1 प्यार सवाल है, और प्रतिक्रियाओं की विविधता :) – karim79

उत्तर

7

मुझे यकीन है कि आप नियमित अभिव्यक्तियों के साथ कुछ झटके कर सकते हैं, लेकिन क्यों न केवल प्रत्येक अर्धविराम को विस्फोट करें और फिर उन्हें एक समय में तीन जोड़ें।

$tmp = explode(";", $string); 
$i=0; 
$j=0; 

foreach($tmp as $piece) { 
    if(! ($i++ %3)) $j++; //increment every 3 
    $result[$j] .= $piece; 
} 
+0

मैं सटीक एक ही बात सोच रहा था ... हालांकि वहां नियमित अभिव्यक्ति के साथ एक खूबसूरत तरीका होना चाहिए। –

+0

वहां बहुत अच्छा हो सकता है। लेकिन, चूंकि मैं नियमित अभिव्यक्तियों के साथ भयानक हूं, इसलिए मैं उनसे बचता हूं और –

+0

जैसे कठिन सामान करता हूं "हालांकि नियमित अभिव्यक्तियों के साथ एक सुंदर तरीका होना चाहिए।" हाहाहहाहहाहाहा – nickf

2

शायद इसे एक अलग कोण से संपर्क करें। विस्फोट() यह सब, फिर इसे ट्रिपल में वापस गठबंधन करें। इसलिए जैसा ...

$str = "1;2;3;4;5;6;7;8;9"; 
$boobies = explode(";", $array); 
while (!empty($boobies)) 
{ 
    $foo = array(); 
    $foo[] = array_shift($boobies); 
    $foo[] = array_shift($boobies); 
    $foo[] = array_shift($boobies); 
    $bar[] = implode(";", $foo) . ";"; 
} 

print_r($bar); 

सरणी ( [0] => 1, 2, 3, [1] => 4; 5, 6, [2] => 7, 8, 9 ; )

+0

आकर्षक परिवर्तनीय नामकरण। – linead

+0

डाउनवोट हटा दिया गया, लेकिन मुझे कहना है कि मुझे लगता है कि (जबकि खाली ($ boobies)) बल्कि परेशान है। और मुझे उम्मीद है कि आप काम पर अपने परिवर्तनीय नामों को अश्लील नहीं बनाते हैं। – karim79

1
$string = "piece1;piece2;piece3;piece4;piece5;piece6;piece7;piece8;piece9;"; 
preg_match_all('/([A-Za-z0-9\.]*;[A-Za-z0-9\.]*;[A-Za-z0-9\.]*;)/',$string,$matches); 

print_r($matches); 

Array 
(
    [0] => Array 
     (
      [0] => piece1;piece2;piece3; 
      [1] => piece4;piece5;piece6; 
      [2] => piece7;piece8;piece9; 
     ) 

    [1] => Array 
     (
      [0] => piece1;piece2;piece3; 
      [1] => piece4;piece5;piece6; 
      [2] => piece7;piece8;piece9; 
     ) 

) 
+2

यह तब विफल हो जाता है जब आउटपुट सरणी को प्रारूपित करने के लिए टुकड़ों की संख्या 3. – mercator

1

यहाँ एक regex दृष्टिकोण है, जो मैं नहीं कह सकता सब भी अच्छी लग रही है।

$str=''; 
for ($i=1; $i<20; $i++) { 
    $str .= "$i;"; 
} 

$split = preg_split('/((?:[^;]*;){3})/', $str, -1, 
        PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 

आउटपुट:

Array 
(
    [0] => 1;2;3; 
    [1] => 4;5;6; 
    [2] => 7;8;9; 
    [3] => 10;11;12; 
    [4] => 13;14;15; 
    [5] => 16;17;18; 
    [6] => 19; 
) 
1

एक और regex दृष्टिकोण।

<?php 
$string = 'piece1;piece2;piece3;piece4;piece5;piece6;piece7;piece8'; 
preg_match_all('/([^;]+;?){1,3}/', $string, $m, PREG_SET_ORDER); 
print_r($m); 

परिणाम:

Array 
(
    [0] => Array 
     (
      [0] => piece1;piece2;piece3; 
      [1] => piece3; 
     ) 

    [1] => Array 
     (
      [0] => piece4;piece5;piece6; 
      [1] => piece6; 
     ) 

    [2] => Array 
     (
      [0] => piece7;piece8 
      [1] => piece8 
     ) 

) 
+0

का एकाधिक नहीं है: $ m = array_map (create_function ('$ a', '$ a [0];'), $ m); – danamlund

0

Regex स्प्लिट

$test = ";2;3;4;5;6;7;8;9;10;;12;;14;15;16;17;18;19;20"; 
// match all groups that: 
// (?<=^|;) follow the beginning of the string or a ; 
// [^;]* have zero or more non ; characters 
// ;? maybe a semi-colon (so we catch a single group) 
// [^;]*;? again (catch second item) 
// [^;]* without the trailing ; (to not capture the final ;) 
preg_match_all("/(?<=^|;)[^;]*;?[^;]*;?[^;]*/", $test, $matches); 
var_dump($matches[0]); 


array(7) { 
    [0]=> 
    string(4) ";2;3" 
    [1]=> 
    string(5) "4;5;6" 
    [2]=> 
    string(5) "7;8;9" 
    [3]=> 
    string(6) "10;;12" 
    [4]=> 
    string(6) ";14;15" 
    [5]=> 
    string(8) "16;17;18" 
    [6]=> 
    string(5) "19;20" 
} 
3

अनिवार्य रूप से अन्य लोगों कि explode रूप में एक ही समाधान है और फिर से शामिल होने ...

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

while ($tmp) { 
    $output[] = implode(';', array_splice($tmp, 0, 3)); 
}; 
5

सबसे आसान समाधान मैं ओ सोच सकता हूँ च है:

$chunks = array_chunk(explode(';', $input), 3); 
$output = array_map(create_function('$a', 'return implode(";",$a);'), $chunks); 
+0

पहली पंक्ति के लिए +1, दूसरे के लिए -1;) ('create_function()' का उपयोग करना खराब व्यवहार है)। PHP 5 से शुरू हो रहा है।3 आप इसके लिए एक लैम्ब्डा फ़ंक्शन का उपयोग कर सकते हैं, हालांकि: '$ output = array_map (फ़ंक्शन ($ ए) {वापसी इंपोड (';', $ ए);}, $ भाग);' – mercator

+0

हाँ सच है। मुझे लगता है कि हम अब उत्तर में 5.3 फीचर्स का उपयोग शुरू कर सकते हैं। – cletus

+0

कोड के लिए +1 जो बॉक्स के ठीक बाहर काम करता है (भले ही यह थोड़ा बहिष्कृत हो)। मैं एक त्वरित समाधान चाहता था जिसे मैं खींच और छोड़ सकता था, और आसानी से अनुकूलित कर सकता था। यही था वह। –

संबंधित मुद्दे