Как взорвать строку справа налево?

Прежде всего, вы хотите сбросить j, k на каждой итерации с помощью этого метода, если я правильно понимаю.

Во-вторых, по какой-то причине второй цикл for увеличивает n вместо i.

В-третьих, вы также объявляете arr2, не инициализируете его и по какой-то причине добавляете значения в arr2 к k.

Вы включаете и медиану. Попробуйте n = 2.

j = arr [2] + arr [3] + arr [4] = 2 + 5 + 0 = 7
k = arr [0] + arr [ 1] = 1 + 4 = 0

предложенные изменения цикла while (для поддержания того же метода):

while (n <= 5) {
    j = 0; k = 0;
    for (i = n+1; i < 5; i++) {
        j+= arr[i];
    }
    for (i = 0; i < n; i++) {
        k+= arr[i]
    }
    if (k == j) {
        cout << "\n" << arr[n];
        break; //you should end the for loop here
    }
    n++;
}
18
задан hakre 12 June 2012 в 10:43
поделиться

6 ответов

Можно использовать strrev, чтобы инвертировать строку и затем инвертировать результаты назад:

$split_point = ' - ';
$string = 'this is my - string - and more';

$result = array_map('strrev', explode($split_point, strrev($string)));

Не уверенный, если это - лучшее решение все же.

27
ответ дан 30 November 2019 в 06:12
поделиться

Как насчет этого:

$parts = explode($split_point, $string);
$last = array_pop($parts);
$item = array(implode($split_point, $parts), $last);

Не собираясь получать любые премии гольфа, но это показывает намерение и работает хорошо, я думаю.

12
ответ дан 30 November 2019 в 06:12
поделиться

Если я понимаю правильно, Вы хотите, чтобы случай в качестве примера дал Вам ('это - мой - строка', 'и больше')?

Встроенный разделял/взрывал, кажется, только для форвардов - необходимо будет, вероятно, реализовать его сами с strrpos. (оставленный праву поиск)

$idx = strrpos($string, $split_point);
$parts = array(substr($string, 0, $idx), substr($string, $idx+strlen($split_point)))
4
ответ дан 30 November 2019 в 06:12
поделиться

Почему бы не разделить на '-', но затем присоединяются к первым двум записям массива, которые Вы возвращаете вместе?

2
ответ дан 30 November 2019 в 06:12
поделиться

Принятие Вас только хочет, чтобы первое вхождение $split_point было проигнорировано, это должно работать на Вас:

# retrieve first $split_point position
$first = strpos($string, $split_point);
# retrieve second $split_point positon
$second = strpos($string, $split_point, $first+strlen($split_point));
# extract from the second $split_point onwards (with $split_point)
$substr = substr($string, $second);

# explode $substr, first element should be empty
$array = explode($split_point, $substr);

# set first element as beginning of string to the second $split_point
$array[0] = substr_replace($string, '', strpos($string, $substr));

Это позволит Вам разделять на каждом возникновении $split_point после (и включая) второе возникновение $split_point.

0
ответ дан 30 November 2019 в 06:12
поделиться

Просто идея:

function explode_reversed($delim,$s){
  $result = array();
  $w = "";
  $l = 0;
  for ($i = strlen($s)-1; $i>=0; $i-- ):
    if ( $s[$i] == "$delim" ):
      $l++;
      $w = "";
    else:
      $w = $s[$i].$w;
    endif;
    $result[$l] = $w;
  endfor;
return $result;
}
$arr = explode_reversed(" ","Hello! My name is John.");
print_r($arr);

Результат:

Array
(
    [0] => John.
    [1] => is
    [2] => name
    [3] => My
    [4] => Hello!
)

, Но это намного медленнее, тогда взрываются. Тест сделал:

$start_time = microtime(true);
for ($i=0; $i<1000;$i++)   
  $arr = explode_reversed(" ","Hello! My name is John.");
$time_elapsed_secs = microtime(true) - $start_time;
echo "time: $time_elapsed_secs s<br>";

Берет 0.0625 - 0,078125 s

, Но

for ($i=0; $i<1000;$i++)   
  $arr = explode(" ","Hello! My name is John.");

Берут всего 0,015625 s

, которые быстрое решение, кажется:

array_reverse(explode($your_delimiter, $your_string));

В цикле 1 000 раз это - наилучшее время, я могу получить 0,03125 с.

0
ответ дан 30 November 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: