Самый День
Оракул
(99750)
4 года назад
сначала идёшь на перебор всех значений массива, затем в этом переборе проверяешь только отрицательные значения (ищешь и запоминаешь их), ищешь следующее отрицательное значение, как находишь меняешь их местами, присваивая им индексы, одному один, а другому другой...
5, 10, -1, 5, 8, -16, 2, 15, - 2, 8, -4, 3
массив [0] = 5
массив [1] = 10
массив [2] = -1
массив [3] = 8
массив [4] = -16
массив [5] = 2
массив [6] = 15
массив [7] = -2
массив [8] = 8
массив [9] = -4
массив [10] = 3
прогоняем в цикле этот массив
0 - 5 (ищем первый отрицательный)
1 - 10 (ищем первый отрицательный)
2 - (-1) (вот и первый отрицательный, с индексом 2) $temp1 = массив [1] ;
3 - 8 (ждём второй отрицательный)
4 - (-16) (вот и второй отрицательный, с индексом 4) $temp2 = массив [4] ;
----------
меняем местами элементы
массив [4] = $temp1 ;
массив [2] = $temp2 ;
----------
5 - 2 (ищем первый отрицательный)
6 - 15 (ищем первый отрицательный)
7 - (-2) (вот и первый отрицательный, с индексом 7) $temp1 = массив [7] ;
8 - 8 (ждём второй отрицательный)
9 - (-4) (вот и второй отрицательный, с индексом 9) $temp2 = массив [9] ;
----------
меняем местами элементы
массив [9] = $temp1 ;
массив [7] = $temp2 ;
----------
10 - 3 (ищем первый отрицательный)
Самый ДеньОракул (99750)
4 года назад
<?php
$arr = array (5, 9, -1, 5, 8, -6, 2, 7, -2, 8, -4, 5, 8, 3, 7, -3, 6, 3 );
print "<pre>"; print_r($arr); print "</pre>";
$tmp1 = $tmp2 = array();
$lines = count($arr);
for ($i=0; $i<$lines; $i++){
if($arr[$i] < 0 and empty($tmp1[0])){ $tmp1 = array ($i, $arr[$i]); }
elseif($arr[$i] < 0 and! empty($tmp1[0]) and empty($tmp2[0])){ $tmp2 = array ($i,
$arr[$i]); }
elseif(!empty($tmp1[0]) and! empty($tmp2[0])){
$index1 = $tmp1[0];
$var1 = $tmp1[1];
$index2 = $tmp2[0];
$var2 = $tmp2[1];
$arr[$index1] = $var2;
$arr[$index2] = $var1;
$tmp1 = $tmp2 = array();
}
}
print "<pre>"; print_r($arr); print "</pre>";
?>
Gruppenführer (ϟϟ)
Гуру
(2898)
4 года назад
Я вообще в PHP равен нулю, но вот что получилось, не знаю правильный подход или нет, если вам хочется поучится, то порекомендовал бы не смотреть на код ниже, так как писать это, для меня было весело, пусть будет и вам.
<?php
$i = 0;
$array = [-5, -10, 1, 5, 8, -16, 2, -15, -2, 8, 4, 3];
foreach ($array as $value){
if ($value < 0){
$i++;
}
}
if ($i < 2){
die("Нету достаточного количества отрицательных чисел для преобразования.");
}
else{
$new_arr = [];
foreach ($array as $key => $value){
if ($value < 0 && $new_arr[ $key - 1 ] < 1 && $new_arr[ $key - 1 ] != null && $i != false ){
// Первым мы проверили является ли это отрицательным числом
// Вторым, является ли предыдущее число отрицательным, вычитав порядковый номер ключа массива
// Третим, при вычитании одного из первого ключа элемента (который начинается с нуля), получается, что мы вычитаем один из нуля
// что даёт нам -1, а элемент с ключом -1 не существует, таковым образом его значение равно null, так как null меньше одного, пришлось поставить дополнительную проверку
// Четвертым мы проверили является ли этот ключ чётным, причина описана в последующем комментарии.
$to_be_previous = $value;
$this_one = $new_arr[$key - 1];
$new_arr[$key - 1] = $to_be_previous;
$new_arr[$key] = $this_one;
$i = false; // Заглушка на случай если три элемента подряд отрицательные
}
else{
$new_arr[$key] = $value;
$i = true;
}
}
var_dump($array);
echo "<" . "br" .">". "Это был предыдущий, а преобразованный вариант:" . "<" . "br" .">"; // Отделил br чтобы mail.ru не преобразовывал.
var_dump($new_arr);
}
?>