Возможно ли заменить ключ массива не изменяя порядок следования элементов в массиве?

alekciy

Новичок
Возможно ли заменить ключ массива не изменяя порядок следования элементов в массиве?

Собственно возможно ли это?
Понятное дело, что можно создать новый массив, пройтись по старому foreach'ем и скопировать все элеметны со старыми индексами, а нужный с новым (порядок тогда сохранится).



После некоторых эспериментов и листания манов я пришел к такому коду:
PHP:
<?php
$fruits = array (
    "a" => array('Петя', 'Камушкин'),
    "b" => array('Вася', 'Иванов'),
    "q" => array('Изя', 'Шниперсон'),
    "c" => array('Феля', 'Урюканский')
);
print "Исходный массив<br>";
foreach ($fruits as $key => $val) {
	print "Поле: ".$key." значение: ".$val."<br>";
};
$source="q";
$new=array ("s" => array('Изя', 'Шниперсон'));
$count=count($fruits);
reset ($fruits);
 
for ($i=0; $i<$count; $i++) {
	if (key($fruits) == $source) {
		array_splice ($fruits, $i, 1, $new);
	};
	next ($fruits);
};
print "<br>";
print "Конечный массив<br>";
foreach ($fruits as $key => $val) {
	print "Поле: ".$key."<br>";
	foreach ($val as $k => $v) {
	print "Поле: ".$k." значение: ".$v."<br>";
	};
};
?>
НО!!!
Обратите внимание, что ключи массива replacement не сохраняются.
Если бы не это, то все бы работало на ура. А так как изменить значение ключа с "0" на заданный я не знаю. Разве только обратиться к разработчику PHP с просьбой/предложением иметь возможность сохранению ключа (к примеру добавив для для функции array_splice ещё один параметр булевого типа).

Может быть нечно подобное уже было?
 

zarus

Хитрожопый макак
array_keys();
array_values();
array_combine();
идем, и ффтыкаем, как построить алгоритм
 

white phoenix

Новичок
Во-первых у тебя бред написан в названии, вот как правильно: "Возможно ли изменить ключ в одном из элементов массива не изменяя порядок следования элементов?"
Я понимаю вот как.. дается массив, надо заменить например ключ "q" на "s".
PHP:
$fruits = array ( 
    "a" => "a", 
    "b" => "b", 
    "q" => "q", 
    "c" => "c"
);
function replacekey(&$array,$currentkey,$newkey)
{
$k  = array_keys($array);
$cpos = array_search($currentkey,$k);
$array = array_merge(array_slice($array,0,$cpos),array($newkey => $array[$currentkey]),array_slice($array,$cpos+1));
}
replacekey($fruits,"q","s");
var_dump($fruits);
/*
array(4) {
  ["a"]=>
  string(1) "a"
  ["b"]=>
  string(1) "b"
  ["s"]=>
  string(1) "q"
  ["c"]=>
  string(1) "c"
}
*/
-~{}~ 23.11.05 09:37:

P.S. foreach это неоправданные потери в скорости.
zarus
из всех перечисленных тобой функция используется только [m]array_keys[/m] :)
 

Panchous

Павел
white phoenix,
а что?
один foreach медленнее, чем твои array_keys, array_search, array_merge, array_slice, array_slice?
 

white phoenix

Новичок
Panchous
да. array_keys и array_search ищут позицию на которой находится currentkey, а затем берем всё что до этой позиции, затем новый ключ, а потом всё остальное за исключением currentkey.
> один foreach
ржунимагу... это ты глазами видишь один, но эта конструкция перебирает по отдельности каждый элемент массива, т.е. код заключенный в фигурные скобки исполняется столько раз сколько элементов у массива.
 

alekciy

Новичок
white phoenix
Я понимаю вот как.. дается массив, надо заменить например ключ "q" на "s".
Да. При этом требуется, что бы значение элемента не изменилось, и что бы так же не изменился порядок следования элементов массива.

Спасибо, попробую.
 

alekciy

Новичок
white phoenix
решение верное?
Да, спасибо. Именно так и должно быть.

Фанат
а можно поинтересоваться - зачем тебе это? =)
Если вопрос мне, то конечно можно. Просто возникла вот такая задача, но не у меня. Вся что я смог с ходу посоветовать я привел в первом топике. Решение как видишь реализовано не до конца. А мне стало любопытно, как все же это можно было сделать не через foreach. Так что сейчас это больше желание решить поставленную задачу, практического применения нет.
Но это хороший задел на будущее поскольку ведь и у меня может возникнуть такая же ситуация. Решая такие вот мелкие задачи листаешь мануал в поисках реализации решения алгоритма. При этом попутно многое приходиться опробывать. Для обучения самое то.
(убедился в этом ещё в студенческую пору).
 

Фанат

oncle terrible
Команда форума
у меня может возникнуть такая же ситуация.
у меня до сих пор не возникала.
и врядли возникнет.
и, немного подумав, можно догадаться - почему.

возникла вот такая задача, но не у меня
К сожалению, я, в отличие от тебя, не кидаюсь сразу задачу решать, а сначала выясняю степерь её осмысленности.

А то у одного товарища, который обратился к доктору, тоже задача возникла....
 

alekciy

Новичок
Фанат
К сожалению, я, в отличие от тебя, не кидаюсь сразу задачу
решать, а сначала выясняю степерь её осмысленности.

Так я тоже на все задачи не кадаюсь. Но вот этой заинтерисовался.

и, немного подумав, можно догадаться - почему.
Неее.... я не телепат, не догадаюсь.
 
Сверху