Взорваться над каждым другим словом - PullRequest
3 голосов
/ 08 мая 2009

Допустим, у меня есть строка:

$string = "This is my test case for an example."

Если я взорвусь, основываясь на '', я получу

Array('This','is','my','test','case','for','an','example.');

То, что я хочу, это взрыв для любого другого пространства:

Array('This is','my test','case for','an example.').

Строка может содержать нечетное количество слов, поэтому последний элемент в массиве может не содержать двух слов.

Кто-нибудь знает, как это сделать?

Ответы [ 9 ]

11 голосов
/ 08 мая 2009

Я бы посмотрел результаты и конкатенировал строки после факта.

8 голосов
/ 08 мая 2009
$matches = array();
preg_match_all('/([A-Za-z0-9\.]+(?: [A-Za-z0-9\.]+)?)/',
       'This is my test case for an example.',$matches);

print_r($matches);

Выходы:

Array
(
  [0] => Array
    (
        [0] => This is
        [1] => my test
        [2] => case for
        [3] => an example.
    )

  [1] => Array
    (
        [0] => This is
        [1] => my test
        [2] => case for
        [3] => an example.
    )

)

обновление исправлено, чтобы соответствовать одному слову в конце предложения

3 голосов
/ 12 мая 2009

Функция, которая может использоваться для различных разделителей и чисел.

function explodeEveryNth($delimiter, $string, $n) {
    $arr = explode($delimiter, $string);
    $arr2 = array_chunk($arr, $n);
    $out = array();
    for ($i = 0, $t = count($arr2); $i < $t; $i++) {
        $out[] = implode($delimiter, $arr2[$i]);
    }
    return $out;
}

Тестовый код

var_dump(explodeEveryNth(' ', 'This is a test string', 2));
2 голосов
/ 08 мая 2009

</p> <pre><code>$string = "This is my test case for an example."; preg_match_all("/[a-zA-Z0-9]+\ [a-zA-Z0-9]+/", $string, $matches); print_r($matches);

1 голос
/ 12 мая 2009

В PHP есть 75 функций массива, давайте попробуем использовать их вместо циклов !!

Мне нравится имя функции Кайла. (Я предполагаю, что вы не используете 5.3 и страдаете от create_function)

 function chunk_explode($string, $chunks = 2, $delim = ' ') {
     $A = explode($delim, $string);
     $A = array_chunk($A, $chunks);
     return array_map(
         create_function('$x',
            'return implode(\'' . $delim . '\',$x);'), $A);
 }
1 голос
/ 08 мая 2009

Что-то, что вы можете использовать повторно для других сценариев: (всегда лучше IMO).

Хотя это, вероятно, не самое элегантное решение, оно соответствует общему концептуальному синтаксису других основных функций PHP ...

В любом случае ... Используется рекурсия. Он гибок в том, что позволяет вам указать размер чанка (на случай, если вы захотите сделать это в будущем или для другого проекта). Я сделал это как личный вызов, чтобы увидеть, что я могу придумать.

<?php
function chunk_explode($glue=' ',$pieces='',$size=2,$final=array()) {
    if(!is_string($pieces) && !is_array($pieces)) 
        return false;

    if(is_string($pieces))
        $pieces = explode($glue,$pieces);

    $num_pieces = sizeof($pieces);
    if($num_pieces <= 0) 
       return $final;

    if($num_pieces >= $size) {
        $arr_chunk = array_chunk($pieces, $size);
        array_push($final,implode($glue,$chunk[0]));
        for($i=0;$i<=$size;$i++) { array_shift($pieces); }
        return chunk_explode($glue,$pieces,$size,$final);
    }
    array_push($final,implode($glue,$pieces));
    return $final;
}
$string = "This is my test case for an example.";
chunk_explode(' ',$string,3);

Если эта chunk_explode функция отстой, дайте мне знать, чтобы я мог учиться на своих ошибках.

1 голос
/ 08 мая 2009
$matches = array();
preg_match_all('/\S+(?:\s[A-Za-z0-9.]+|$)/',
    'This is my test case for an example.',
    $matches
);
print_r($matches);
preg_match_all('/\S+(?:\s[A-Za-z0-9.]+|$)/',
    'This is my test case for example.',
    $matches
);
print_r($matches);
0 голосов
/ 09 мая 2009

Ну, очевидно, это не лучшее решение, но было забавно выяснить это по-своему Еще так много нужно узнать ...

function solveThisPuzzle($string) {

$modified_string = preg_replace('(\s)', '+', $string, -1, $count);  
$words = explode('+', $modified_string);

$phrases_arr = array();

for($i = 1; $i < $count+1; $i++) {
    if(($i % 2)) {
        $phrase = $words[$i-1].' '.$words[$i];
        $phrases_arr[] = $phrase;
        unset($phrases_arr[$i]);
    } elseif($i == $count) {
            $phrase = $words[$i];
            $phrases_arr[] = $phrase;
        } else {            
            $phrase = NULL;
        }
}

foreach($phrases_arr as $final_phrase) {
    $solution .= $final_phrase.'<br />';
}

    return $solution;

}

$string = "This is my test case for an example, huzzah!";
echo solveThisPuzzle($string);

This is
my test
case for
an example,
huzzah!
0 голосов
/ 08 мая 2009
    $str = "This is my test case for an example.";
    $arr = split(' ', $str);
    $newArr = array();
    $count = count($arr);
    for($i=0;$i<$count;$i = $i + 2) {
        $newArr[] = $arr[$i] . ' ' . $arr[$i+1];
    }


array(4) {
  [0]=>
  string(7) "This is"
  [1]=>
  string(7) "my test"
  [2]=>
  string(8) "case for"
  [3]=>
  string(11) "an example."
}
...