Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> переставить элементы массива согласно условию 
:(
    Опции темы
cheburashkaRF
Дата 24.1.2014, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 9.11.2011
Где: Новосибирск

Репутация: нет
Всего: нет



Дан массив. Переставить в обратном порядке элементы массива, расположенные между его минимальным и максимальным элементами. 
Код

          $arr=array (1,2,3,4,5);

          $minIndex = 0; 
          $maxIndex = 0;
                
            for ($i = 0; $i < count($arr); $i++)
            {
                if ($arr[$i] > $arr[$maxIndex])
                {
                    $maxIndex = $i;
                }
                elseif ($array[$i] < $arr[$minIndex])
                {
                    $minIndex = $i;
                }
            }
            
            for ( $i = $minIndex + 1, $i < $j;$i++)
            {    
            $b=$arr[$i],
            
               for($j = $maxIndex - 1;$j>0; $j--){
                 
                      $c=$arr[$j]);
               }}
            foreach ($arr as $i)
                    {
                       echo $i;}}

вот мои неудачные наработки

Это сообщение отредактировал(а) cheburashkaRF - 24.1.2014, 17:01
PM MAIL   Вверх
capitan
Дата 24.1.2014, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Код

    $arr=array (1,2,3,4,5);
    $minIndex = min($arr);
    $maxIndex = max($arr);
    $array_start = array();
    $array_replace = array();
    $array_finish = array();

    foreach($arr as $key=>$value){
        if($value <= $minIndex) {
            $array_start[] = $value;
        }
        if($value > $minIndex && $value < $maxIndex){
            $array_replace[$key] = $value;
        }
        if($value >= $maxIndex) {
            $array_finish[] = $value;
        }
    }
    $array_replace = array_reverse($array_replace);

    $result = array_merge_recursive($array_start, $array_replace, $array_finish);    
    var_dump($result);

PM MAIL WWW ICQ   Вверх
cheburashkaRF
  Дата 24.1.2014, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 9.11.2011
Где: Новосибирск

Репутация: нет
Всего: нет



capitan, спасибо ,но мне всё же интересно как сделать тоже самое но без волшебных функций( типа array_merge_recursive и array_reverse )
PM MAIL   Вверх
capitan
Дата 24.1.2014, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Нормальные герои всегда идут в обход? smile Вы тогда опишите, какие функции можно использовать. Т.к. все функции не волшебные, а стандартные smile

Это сообщение отредактировал(а) capitan - 24.1.2014, 18:06
PM MAIL WWW ICQ   Вверх
cheburashkaRF
Дата 24.1.2014, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 9.11.2011
Где: Новосибирск

Репутация: нет
Всего: нет



я имел в виду вот енти функции: array_merge_recursive и array_reverse ,вот как бы так заморочиться чтоб без них усё заработало
PM MAIL   Вверх
capitan
Дата 25.1.2014, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



такой велосипед пойдет?
Код

    $arr=array (1,2,3,4,5);
    $minIndex = min($arr);
    $maxIndex = max($arr);
    $array_start = array();
    $array_replace = array();
    $array_finish = array();

    foreach($arr as $value){
        if($value <= $minIndex) {
            $array_start[] = $value;
        }
        if($value > $minIndex && $value < $maxIndex){
            $array_replace[] = $value;
        }
        if($value >= $maxIndex) {
            $array_finish[] = $value;
        }
    }

    $new_array = array();
    if (count($array_replace) > 0) {
        $all_count = count($array_replace);
        $i = 0;
        foreach($array_replace as $value){ $i++;
            $new_array[$all_count-$i] = $value;
        }
    }
    ksort($new_array);

    $result = array();

    if(!empty($array_start)) {
        foreach($array_start as $value){
            $result[] = $value;
        }
    }

    if(!empty($new_array)) {
        foreach($new_array as $value){
            $result[] = $value;
        }
    }

    if(!empty($array_finish)) {
        foreach($array_finish as $value){
            $result[] = $value;
        }
    }
    echo '<pre>';
    var_dump($result);

PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 28.1.2014, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



что-то "крутые" решения  smile 
 
читаю вопрос буквально и вот что получается

Код

$a = array('2', '1', '4', '5', '3');

// сортируем  первоначально массим
sort($a);

// получаем минимальное значение
$first = array_shift($a);

// получаем максимальное значение
$last = array_pop($a);

// сортируем оставшийся массив в обратном порядке
rsort($a);

// Добавляем минимальное значение в начало
array_unshift($a, $first);

// Добавляем максимальное значение в конец
array_push($a, $last);

// выводим результат
print_r($a);


Цитата

Array ( 
   [0] => 1 
   [1] => 4
   [2] => 3 
   [3] => 2 
   [4] => 5 




--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 28.1.2014, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(Gold Dragon @  28.1.2014,  18:39 Найти цитируемый пост)
читаю вопрос буквально

буквально, значит из массива
Код

array('key1'=>1, 'a', 5, 'key2'=>8, 'b', 7, 12, 3)
 
получить
Код

array('key1'=>1, 'a', 7, 'b', 'key2'=>8, 5, 12, 3)
 

PM MAIL   Вверх
Gold Dragon
Дата 28.1.2014, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



лучше бы автор привёл какой результат нужно получить  smile иначе baldina, ты вообще меня запутал

я понял что из этого
Цитата

array (1,2,3,4,5)

нужно получить это
Цитата

array (1,4,3,2,5)

- минимальное 1
- максимальное 5
- между ними 2,3,4, 
- обратный порядок 4,3,2


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
bars80080
Дата 28.1.2014, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



ну, у capitan не велосипед в последнем варианте, а мощное инженерное сооружение из кирпича. но и Gold Dragon решил запутать. array_shift и прочие функции в примере возвращаю первые и последние элементы, а не максимальные и минимальные

Код

$arr = array(1,2,3,4,5);
$min = min($arr);
$max = max($arr);
$points = array(array_search($min, $arr), array_search($max, $arr));
sort($points);

$mid = array_slice($arr, $points[0], $points[1]);
$mid = array_reverse($mid);

array_splice($arr, $points[0], ($points[1] - $points[0]), $mid);

var_dump($arr);

наверное, так будет линейно и проще
PM MAIL WWW   Вверх
baldina
Дата 28.1.2014, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(Gold Dragon @  28.1.2014,  21:41 Найти цитируемый пост)
 из этого

про это есть только в примере, помеченном "мои неудачные наработки". ТС возможно и в голову не пришло, что и значения и ключи могут быть не только числовыми, а массив не отсортирован.
в общем виде думаю решение должно быть таким
http://ideone.com/CL7g4S

а для 1,2,3,4,5 все проще:
Код

array_splice ($a, 1,  max(0,count($a)-2), array_reverse (array_slice($a, 1, max(0,count($a)-2))));

или
Код

$count = count($a);
for ($i=1; $i<intval($count/2); ++$i) {
   $j = $count-$i-1;
   $temp = $a[$i];
   $a[$i]=$a[$j];
   $a[$j]=$temp;
}

PM MAIL   Вверх
Gold Dragon
Дата 29.1.2014, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(bars80080 @  28.1.2014,  23:20 Найти цитируемый пост)
Dragon решил запутать. array_shift и прочие функции в примере возвращаю первые и последние элементы, а не максимальные и минимальные
А сортировку первоначально я зачем делаю?  smile

Добавлено через 3 минуты и 14 секунд
Цитата(baldina @  28.1.2014,  23:28 Найти цитируемый пост)
а для 1,2,3,4,5 все проще:
ну так есть встроенные функции, зачем перебором что-то делать smile

PS
хотя эта задачка больше "философские размышления" чем "реали жизни"


Это сообщение отредактировал(а) Gold Dragon - 29.1.2014, 07:53


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
capitan
Дата 29.1.2014, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Gold Dragon
baldina
bars80080

Почитайте 3-е сообщение smile Человек знает только for и array Т.ч. строим мощное сооружение из кирпича smile
Цитата

я имел в виду вот енти функции: array_merge_recursive и array_reverse ,вот как бы так заморочиться чтоб без них усё заработало 


Это сообщение отредактировал(а) capitan - 29.1.2014, 12:23
PM MAIL WWW ICQ   Вверх
baldina
Дата 29.1.2014, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.