Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > переставить элементы массива согласно условию


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

          $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;}}

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

Автор: capitan 24.1.2014, 17:26
Код

    $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);

Автор: cheburashkaRF 24.1.2014, 17:54
capitan, спасибо ,но мне всё же интересно как сделать тоже самое но без волшебных функций( типа array_merge_recursive и array_reverse )

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

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

Автор: capitan 25.1.2014, 16:52
такой велосипед пойдет?
Код

    $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);

Автор: Gold Dragon 28.1.2014, 18:39
что-то "крутые" решения  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 


Автор: baldina 28.1.2014, 21:05
Цитата(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)
 

Автор: Gold Dragon 28.1.2014, 21:41
лучше бы автор привёл какой результат нужно получить  smile иначе baldina, ты вообще меня запутал

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

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

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

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

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

Автор: bars80080 28.1.2014, 22:20
ну, у 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);

наверное, так будет линейно и проще

Автор: baldina 28.1.2014, 22:28
Цитата(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;
}

Автор: Gold Dragon 29.1.2014, 07:52
Цитата(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
хотя эта задачка больше "философские размышления" чем "реали жизни"

Автор: capitan 29.1.2014, 12:22
Gold Dragon
baldina
bars80080

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

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

Автор: baldina 29.1.2014, 15:42
http://ideone.com/cC9PGO

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)