Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.63
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
#1

Как сдвинуть массив на k элементов? - PHP

13.11.2010, 19:38. Просмотров 6117. Ответов 13
Метки нет (Все метки)

помоги кто сделать. работает при $k = 5 если другое то не работает....

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$k = 5; // Смещение
 
for ($i = 0; $i < $count/2; $i++)
{
    if ($i + $k < $count)
    {
        // $array[$i] на $array[$i + $k]
        $a = $array[$i];
        $array[$i] = $array[$i + $k];
        $array[$i + $k] = $a;
    }
    else
    {
        // $array[$i] на $array[$i + $k - $count]
        $a = $array[$i];
        $array[$i] = $array[$i + $k - $count];
        $array[$i + $k - $count] = $a;
    }
}
заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2010, 19:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как сдвинуть массив на k элементов? (PHP):

Как внутри foreach сдвинуть указатель массива вперед?
День добрый. Получаю выборку с sql так $stmtt =...

Как сдвинуть меню ниже, чтобы было больше места под логотип?
:)Уважаемые форумчане выручайте))не получается подвинуть меню вниз,хочется...

Массив: Как организовать цикл для всех элементов данного массива?
Добрый день. Есть массив вида $itaf_group = array( array('id' =&gt;...

Как проверить массив на существование определенных элементов?
Вот у меня есть массив $_POST = 10101010; если содержаться только символы 0 и 1...

Сдвинуть массив на k элементов вправо и влево
Вправо сдвинул, а влево - выход за пределы массива //Циклически сдвинуть...

Сдвинуть массив А циклически на m элементов вправо
2. Напишите программу, в которой создается одномерный массив (заполненный...

13
Sonax
349 / 75 / 9
Регистрация: 13.10.2010
Сообщений: 829
13.11.2010, 19:46 #2
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$k = 5; // Смещение
 
for ($i = 0; $i < $count/2; $i++)
{
        if (($i + $k) < $count)
        {
                // $array[$i] на $array[$i + $k]
                $a = $array[$i];
                $array[$i] = $array[$i + $k];
                $array[$i + $k] = $a;
        }
        else
        {
                // $array[$i] на $array[$i + $k - $count]
                $a = $array[$i];
                $array[$i] = $array[$i + $k - $count];
                $array[$i + $k - $count] = $a;
        }
}
Возможно ошибка в скобках
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
13.11.2010, 19:50  [ТС] #3
Цитата Сообщение от Sonax Посмотреть сообщение
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$k = 5; // Смещение
 
for ($i = 0; $i < $count/2; $i++)
{
        if (($i + $k) < $count)
        {
                // $array[$i] на $array[$i + $k]
                $a = $array[$i];
                $array[$i] = $array[$i + $k];
                $array[$i + $k] = $a;
        }
        else
        {
                // $array[$i] на $array[$i + $k - $count]
                $a = $array[$i];
                $array[$i] = $array[$i + $k - $count];
                $array[$i + $k - $count] = $a;
        }
}
Возможно ошибка в скобках
нет. так не работает. если бы там было например !($i % 2) то это отлично от !$i % 2, а тут тоже самое.
0
Sonax
349 / 75 / 9
Регистрация: 13.10.2010
Сообщений: 829
13.11.2010, 20:01 #4
Можно поподробнее задачу объяснить и код полнее выложить? Если я правильно понял, то в переменной $a задуман массив, но тогда и нужно написать $a[$i]
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
13.11.2010, 20:29  [ТС] #5
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$array = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
$count = count($array);
$k = 4; // Смещение
 
for ($i = 0; $i < $count/2; $i++)
{
        if (($i + $k) < $count)
        {
                // $array[$i] на $array[$i + $k]
                $a = $array[$i];
                $array[$i] = $array[$i + $k];
                $array[$i + $k] = $a;
                echo $i." на ".($i + $k).'<br />';
        }
        else
        {
                // $array[$i] на $array[$i + $k - $count]
                $a = $array[$i];
                $array[$i] = $array[$i + $k - $count];
                $array[$i + $k - $count] = $a;
                echo $i." на ".($i + $k - $count).'<br />';
        }
}
 
for ($i = 1; $i < $count; $i++)
{
    echo $array[$i]." ";
}
Добавлено через 1 минуту
$a - временная переменная чтобы поменять элементы местами.
0
Sonax
349 / 75 / 9
Регистрация: 13.10.2010
Сообщений: 829
13.11.2010, 21:19 #6
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$a = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
$count = count($a);
$k = 4; // Смещение
 
for ($i = 0; $i < $count/2; $i++)
{
        if (($i + $k) < $count)
        {
                // $array[$i] на $array[$i + $k]
                $a[$i] = $array[$i];
                $array[$i] = $array[$i + $k];
                $array[$i + $k] = $a;
                                echo $i." на ".($i + $k).'<br />';
        }
        else
        {
                // $array[$i] на $array[$i + $k - $count]
                $a[$i] = $array[$i];
                $array[$i] = $array[$i + $k - $count];
                $array[$i + $k - $count] = $a;
                                echo $i." на ".($i + $k - $count).'<br />';
        }
}
 
for ($i = 1; $i < $count; $i++)
{
        echo $array[$i]." ";
}
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
13.11.2010, 21:34  [ТС] #7
всё, извиняюсь, способ неверен
0
insideone
Модератор
Автор FAQ
3657 / 937 / 112
Регистрация: 10.01.2010
Сообщений: 2,513
14.11.2010, 01:19 #8
PHP
1
2
3
4
5
6
$data = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
$tab = 5;
$result = array_merge(array_slice($data, $tab), array_slice($data, 0, $tab));
 
foreach($result as $val)
    echo $val . ' ';
5 6 7 8 9 0 1 2 3 4

Если я конечно правильно понял задачу
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
14.11.2010, 01:33  [ТС] #9
Цитата Сообщение от insideone Посмотреть сообщение
PHP
1
2
3
4
5
6
$data = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
$tab = 5;
$result = array_merge(array_slice($data, $tab), array_slice($data, 0, $tab));
 
foreach($result as $val)
    echo $val . ' ';
5 6 7 8 9 0 1 2 3 4

Если я конечно правильно понял задачу
спасибо так и я могу. вот рабочий вариант без применения функций и т.п.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$array = array(0, 1, 2, 3, 4);
$count = count($array);
$k = 16; // Смещение
    
for ($j = 1; $j <= $k; $j++)
{
    $e = $array[0];
    
    for ($i = 1; $i < $count; $i++)
    {
        $array[$i - 1] = $array[$i];
    }
    
    $array[$count - 1] = $e;
}
p.s. и легко переписывается на c++. что изначально и надо было.
0
insideone
Модератор
Автор FAQ
3657 / 937 / 112
Регистрация: 10.01.2010
Сообщений: 2,513
14.11.2010, 02:03 #10
p.s. и легко переписывается на c++. что изначально и надо было
Зачем? И где надо было, я не нашёл упоминаний
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
14.11.2010, 02:23  [ТС] #11
Зачем? И где надо было, я не нашёл упоминаний
задали в универе. сначал написал на c++ не работала, что проще отлаживать, написал на php, проблема осталась, потом переписал подругому. всё работает и там и там.

если кому интересно на c++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <stdlib.h>
using namespace std;
 
int main()
{
    const int count = 5;
    int Array[count];
    int k = 3; // Смещение
    
    for (int i = 0; i < count; i++)
    {
        cin >> Array[i];
    }
 
    for (int j = 1; j <= k; j++)
    {
        int e = Array[0];
    
        for (int i = 1; i < count; i++)
        {
            Array[i - 1] = Array[i];
        }
    
        Array[count - 1] = e;
    }
 
 
    for (int i = 0; i < count; i++)
    {
        cout << Array[i] << " ";
    }
    
    system("pause");
}
0
insideone
Модератор
Автор FAQ
3657 / 937 / 112
Регистрация: 10.01.2010
Сообщений: 2,513
14.11.2010, 12:06 #12
vvsh, ну извиняй, не знал) но на stl наверное подобные алгоритмы тоже есть, если им конечно можно пользоваться...
0
vvsh
6 / 6 / 1
Регистрация: 29.10.2009
Сообщений: 143
14.11.2010, 16:39  [ТС] #13
Цитата Сообщение от insideone Посмотреть сообщение
vvsh, ну извиняй, не знал) но на stl наверное подобные алгоритмы тоже есть, если им конечно можно пользоваться...
ой... мне ничем нельзя пользоваться =)
0
Жора Боков
0 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 2
23.06.2014, 21:07 #14
Читал тут вот ваши рассуждения о сдвиге ключей массива и решил тоже немного озадачиться.
В общем, готов поделиться своими наработками по этой теме , кому пригодится может , то на здоровье.
Первое, что необходимо понять - каким образом и в какую сторону массив необходимо сдвинуть.
Сдвигается не ассоциативный массив так же , как сдвигаются фигуры на Декартовой плоскости: необходимо знать, на сколько сдвинуть все точки фигуры и в какую сторону. Массив , если его представить как значения оси ординат или абсцисс , так же может сдвигаться независимо от того , какая последовательность ключей задана внутри массива и с какой позиции массив начинается:
PHP
1
2
3
4
//пример массива 
$array[10]  = 1;
$array[5]    = 2;
$array[-15] = 'дает корова  молоко';
Необходимо каждый ключ массива изменить на конкретное значение.
Вот что у меня получилось :
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 function parallax($x,$array)
  {
     $keys = array_keys($array);
        $i=0;
        $result = array();
        reset($array);
        while($i!=count($array))
        {
            $result[($keys[$i])+$x] = $array[$keys[$i]];
            next($array);
            $i++;
        }
        return $result;
  }
Функция умеет работать с любым знаком ( - или + ) и корректно сдвигает массив в любую сторону :

PHP
1
2
3
4
5
6
7
$test[10] = 1;
$test[14] = 2;
$test[-9] = 3;
$test[1]  = 4;
 
$test = parallax(2,$test);
print_r($test);
HTML5
1
2
3
4
5
6
7
8
9
$test:
 
Array
(
    [12] => 1
    [16] => 2
    [-7] => 3
    [3] => 4
)

Но если возникла задача приравнять первый ключ массива к 0 , и сдвинуть все остальные ключи соответственно ? :
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function SetToZero($array)
 {
    $keys = array_keys($array);
    $orign = $keys[0];
    $step = -($orign);
    $i=0;
        $result = array();
        reset($array);
        while($i!=count($array))
        {
            $result[($keys[$i])+$step] = $array[$keys[$i]];
            next($array);
            $i++;
        }
        return $result;
    }
или так :
PHP
1
2
3
4
5
6
$x = array_keys($array)[0];
 
  if($x>0){$x = -($x);}
  if($x<0){$x = +($x);}
 
  $array = parallax($x,$array);
0
23.06.2014, 21:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2014, 21:07
Привет! Вот еще темы с решениями:

Сдвинуть массив на введенное К элементов влево
Условие заключается в том,что нужно массив сдвинуть на введенное К элементов...

Сдвинуть массив циклически на К элементов вправо
Может кто знает.:) Сдвинуть массив циклически на К элементов вправо.

Сдвинуть массив, состоящий из 10 элементов влево на N позиций
Сдвинуть массив, состоящий из 10 элементов влево на N позиций. Например, если...

Циклически сдвинуть массив вправо на заданное количество элементов
Задать массив 13целых чисел, целое число k (k &gt; 0). Вывести массив на экран. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru