Прежде всего, вы хотите сбросить 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++;
}
Можно использовать strrev, чтобы инвертировать строку и затем инвертировать результаты назад:
$split_point = ' - ';
$string = 'this is my - string - and more';
$result = array_map('strrev', explode($split_point, strrev($string)));
Не уверенный, если это - лучшее решение все же.
Как насчет этого:
$parts = explode($split_point, $string);
$last = array_pop($parts);
$item = array(implode($split_point, $parts), $last);
Не собираясь получать любые премии гольфа, но это показывает намерение и работает хорошо, я думаю.
Если я понимаю правильно, Вы хотите, чтобы случай в качестве примера дал Вам ('это - мой - строка', 'и больше')?
Встроенный разделял/взрывал, кажется, только для форвардов - необходимо будет, вероятно, реализовать его сами с strrpos. (оставленный праву поиск)
$idx = strrpos($string, $split_point);
$parts = array(substr($string, 0, $idx), substr($string, $idx+strlen($split_point)))
Почему бы не разделить на '-', но затем присоединяются к первым двум записям массива, которые Вы возвращаете вместе?
Принятие Вас только хочет, чтобы первое вхождение $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.
Просто идея:
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 с.