Ответ 1
Попробуйте следующее:
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
$temp = $a[0];
$a[0] = $a[1];
$a[1] = $temp;
У меня есть массив:
array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
и мне нужно поменять "контакт" на "home", поэтому массив будет выглядеть так:
array(
0 => 'home',
1 => 'contact',
2 => 'projects'
);
как я могу это сделать с PHP?:)
Попробуйте следующее:
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
$temp = $a[0];
$a[0] = $a[1];
$a[1] = $temp;
Я написал простую функцию array_swap
: поменяйте местами два элемента между позициями swap_a
и swap_b
.
function array_swap(&$array,$swap_a,$swap_b){
list($array[$swap_a],$array[$swap_b]) = array($array[$swap_b],$array[$swap_a]);
}
Для вопроса ОП (например):
$items = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
array_swap($items,0,1);
var_dump($items);
// OUTPUT
array(3) {
[0]=> string(4) "home"
[1]=> string(7) "contact"
[2]=> string(8) "projects"
}
Обновление Начиная с PHP 7.1 это можно сделать так:
$items = [
0 => 'contact',
1 => 'home',
2 => 'projects'
];
[$items[0], $items[1]] = [$items[1], $items[0]];
var_dump($items);
// OUTPUT
array(3) {
[0]=> string(4) "home"
[1]=> string(7) "contact"
[2]=> string(8) "projects"
}
Это возможно благодаря деструктуризации симметричного массива.
Просто используйте временную переменную для хранения одного значения при замене другого. Затем восстановите первую переменную temp. Для чисел есть другие методы, которые не требуют использования временных переменных, но здесь это лучший (только?) Способ.
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
print_r($a);
Array ( [0] => contact [1] => home [2] => projects )
$tmp = $a[0];
$a[0] = $a[1];
$a[1] = $tmp;
print_r($a);
Array ( [0] => home [1] => contact [2] => projects )
В PHP 7. 1+ синтаксис, вы можете использовать это
[$Array[$a], $Array[$b]] = [$Array[$b], $Array[$a]];
$array = array(
0 => 'home',
1 => 'contact',
2 => 'projects'
);
$t = $array[0];
$array[0] = $array[1];
$array[1] = $t;
будет достаточно простым подходом...
Просто используйте переменную temp для ее хранения. Так:
$temp = $array[0];
$array[0] = $array[1];
$array[1] = $temp;
Таким образом, вы не потеряете ценность одного из них.
$x = array('a', 'b', 'c', 'd');
array_splice($x, 1, 2, array_reverse(array_slice($x, 1, 2)));
var_dump($x);
array_splice может заменить обратный array_slice
Если вы хотите избежать использования временного хранилища данных или любите использовать однострочный трафик array_replace()
.
array_replace()
будет производить корректировки в соответствии с индексами:
Код: (Демо)
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
var_export(array_replace($a,[$a[1],$a[0]]));
Вывод:
array (
0 => 'home',
1 => 'contact',
2 => 'projects',
)
Решение:
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
list($a[0], $a[1]) = [$a[1], $a[0]];
Я сделал функцию для этого
function swap(&$a, &$b){
list($a, $b) = [$b, $a];
}
Использование:
swap($a[0], $a[1]);
Я проверил 4 способа, предложенных для сравнения производительности:
$array=range(0,9999); //First 10000 natural numbers
$time=-microtime(true); //Start time
for($i=0;$i<1000000;++$i){ //1 Millon swaps
$a=array_rand($array); //Random position: ~60ms
$b=array_rand($array); //Random position: ~60ms
//Using a temp variable: ~70ms
$temp=$array[0];$array[0]=$array[1];$array[1]=$temp;
//Using list language construct: ~ 140ms
list($array[$a],$array[$b])=array($array[$b],$array[$a]);
//Using PHP 7.1+ syntax: ~ 140ms
[$array[$a],$array[$b]]=[$array[$b],$array[$a]];
//Using array_replace function: ~ 28000ms
array_replace($array,[$array[$a],$array[$b]]);
}
$time+=microtime(true); //Elapsed time
echo "Time: ",sprintf('%f', $time)," seconds";
Хотя это, вероятно, не самый удобный способ, использование временной переменной кажется в 2 раза быстрее, чем следующие 2 метода, и в 400 раз быстрее, чем использование функции array_replace.
Если вы не хотите использовать другую переменную:
$array[0] = $array[0] + $array[1];
$array[1] = $array[0] - $array[1];
$array[0] = $array[0] - $array[1];