|
|
|
| у меня на входе массив из 4х элементов: 9, 15, 21, 3 как мне сделать что бы в массиве поменять местами первый и последний элемент массива ? то есть цифры 9 и 3 | |
|
|
|
|
|
|
|
для: mabelrod
(21.06.2010 в 10:56)
| | массив ассоциативный? | |
|
|
|
|
|
|
|
для: mabelrod
(21.06.2010 в 10:56)
| |
$c=count($mass);
$a=0;
foreach($mass as $key=>$value){
if($a==0) {$k=$key; $v=$value;}
$a++;
if($a==$c) {$mass[$key]=$v; $mass[$k]=$value;}
}
|
попробуйте так, но может можно и лучше придумать с несктом и курентом
а если массив имеет фиксированные ключи, то там совсем просто
___
да и не плохо было бы рассказать что это за массив (что за числа) и зачем нужно менять эти числа
задавая вопрос старайтесь полнее описывать задачу, не только что нужно чделать, но и зачем это делать, от этого зависит вариант ответа и скорость решения поставленной задачи | |
|
|
|
|
|
|
|
для: mabelrod
(21.06.2010 в 10:56)
| | array_slice()
+ (операция над массивами)
----
хотя, если подумать здраво, задача приводится к задаче обмена значений двух переменных.
Безо всяких функций и циклов.
PS. Цифры - это не то, что Вы думаете. В массиве у Вас числа, а не цифры. | |
|
|
|
|
|
|
|
для: Trianon
(21.06.2010 в 11:57)
| |
reset($mass);
$v1=prev($mass);
$k1=key($mass);
$v2=end($mass);
$k2=key($mass);
$mass[k1]=$v2;
$mass[$k2]=$v1;
|
а так проканает? | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 13:18)
| |
<?php
$a = array(9, 15, 21, 3);
$last = array_pop($a);
array_push($a, array_shift($a));
array_unshift($a, $last);
|
| |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 13:55)
| | а если массив ассоциативный? | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 13:59)
| | Если если, то не забываем и о ключах. Но такого условия не видно. | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 14:02)
| | вот мне и интересно как будет выглядеть код вспомнив о ключах
мне показалось что код будет сложнее, поэтому сразу отказался от array_pop
___
просто сейчас нет времени запускать денвер и эксперементировать, поэтому
1 код голова-мануал, 2 код голова+мануал :) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 14:07)
| | Чем сложнее?
<?php
$a = array('a'=>9, 'b'=>15, 'c'=>21, 'd'=>3);
$n = array_slice($a,1,-1);
$a = array_reverse($a, true);
array_splice($a, 1, count($n) , $n);
print_r($a);
|
| |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 14:30)
| | вот что у меня ответил денвер
Array ( [d] => 3 [0] => 15 [1] => 21 [a] => 9 ) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 15:22)
| | А вы что хотели? Вас же интересует ассоциация, так почему ключ при перемещении должен изменяться тогда? Вы уж тогда уясняйте чего хотите. | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 15:27)
| | так почему ключ при перемещении должен изменяться тогда
потому что в этом и есть смысл задачи нужно поменять местами значения первого и последнего элемента массива, я не запускал Ваш первый пример, но почему-то уверен, что там до 0-9, 1-15, 2-21, 3-3 и после 0-3, 1-15, 2-21, 3-9
____
а вот КПД Вашего последнего скрипта равно абсолютному нулю :) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 15:41)
| | Если там 0-9..., то забудьте нафик об ассоциации, это уже просто не разумно.
[поправлено модератором] | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 15:53)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 15:57)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 15:59)
| | если к массиву наплевав на ключи обращаться current, то смысл еще есть, а если по ключу массива то как я и сказал КПД = 0%
___
я уверен, что автор имел ввиду не сами элементы массива, а значения этих элементов
могу я ошибаться? конечно могу.
[поправлено модератором] | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 16:04)
| | Вам показали как сменить значения крайних элементов массива, оказалось, что плохо, не учтены ключи ассоциации. Учли ключи, оказывается теперь они нафик не нужны
[поправлено модератором] | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 16:19)
| | вот именно это решение я и попросил Вас написать
(и как мне казалось я выразился абсолютно четко и ясно) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 16:22)
| | Вот этого как раз и не наблюдается - четкости и ясности, ибо первый массив, это чистая рокировка элементов, и в случае с ассоциативным массивом, это будет означать и сохранение их ключей.
А вот то, что вы просите, так это обмен значениями крайних массивов, и сделать это тоже можно лекго, намного легче вашего. Читайте мануал, хвать болтать попусту | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 16:27)
| | я настаиваю, делайте, в противном случае это будет означать болтать попусту
оба моих скрипта (второй нужно немного поправить)
работают с любым массивом и с любым количеством элементов этого массива
и в случае с ассоциативным массивом, это будет означать и сохранение их ключей
вот это Вы как раз придумали сами и пытаетесь мне это навязать
вот мои исправленные решения:
<?php
$mass=array('a'=>9, 'b'=>15, 'c'=>21, 'd'=>3);
print_r($mass); echo "<br />";
reset($mass);
$v1=current($mass);
$k1=key($mass);
$v2=end($mass);
$k2=key($mass);
$mass[$k1]=$v2;
$mass[$k2]=$v1;
print_r($mass); echo "<br />";
?>
<hr>
<?php
print_r($mass); echo "<br />";
$c=count($mass);
$a=0;
foreach($mass as $key=>$value){
if($a==0) {$k=$key; $v=$value;}
$a++;
if($a==$c) {$mass[$key]=$v; $mass[$k]=$value;}
}
print_r($mass); echo "<br />";
|
__
еще раз повторяю, Вы в первом своем коде поменяли местами значения крайних элементов массива, я Вас попросил сделать тоже самое с ассоциативным массивом, а именно поменять значения(!) крайних элементов массива
__
оказалось, что плохо, не учтены ключи ассоциации
и это Вы взяли с потолка и притянули за уши...
я Вас просто попросил "скормить" своему скрипту вместо обычного массива, ассоциативный. | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 16:42)
| | Значит так - можете даже в анналы свой скрипт поместить, мне он не нужен. ;-)
Если бы у автора был ассоциативный массив, то и менять местами его элементы не нужно, ибо на то она и ассоциация, чтобы обращаться к элементу массива по имени. А если поменять значения крайних в ассоцииации, то исходя из вашего уже можно проще:
<?
$a= array('a'=>9, 'b'=>15, 'c'=>21, 'd'=>3);
$n = current($a);
end($a);
$m = current($a);
$a[key($a)]=$n;
reset($a);
$a[key($a)]=$m;
print_r($a);
|
reset($mass); - это лишнее, в только что объявленном массиве указатель никак не будет находиться где-то по середине. | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 17:02)
| | на то она и ассоциация, чтобы обращаться к элементу массива по имени
и что? это замечание к данному вопросу не имеет отношения
можете даже в анналы свой скрипт поместить, мне он не нужен
Вы просто переписали тот код который написал я, а я Вас просил написать скрипт с использованием тех функций которые были в первом скрипте с учетом работы с ассоциативным массивом не просто так
reset($mass); - это лишнее, в только что объявленном массиве указатель никак не будет находиться где-то по середине
в реальном приложение он может быть каким угодно, а учитывая что от reset Вы никуда не ушли (просто написав его двумя строками ниже) и это замечание тоже не уместно.
а теперь самый главный вопрос - о чем мы так долго спорили? если в конце концов написали идентичный код не раз обвинив мнея до этого в ахинее? | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 17:23)
| | Я ничего не перписывал, ибо все что я написал, описано в мануале, а не у вас почерпнуто. По крайней мере, я не буду создавать переменные под ключ, а буду всегда писать так, как написал.
В реальном, это в реальном, вы же объявляете массив, и тут же устанавливаете его указатель в начало.
PS. Собственно, чтобы вам не казалось, что я присвоил авторский код, я напишу как я вижу решение и делал бы (если именно это нужно):
<?
$a= array('a'=>9, 'b'=>15, 'c'=>21, 'd'=>3);
$m = array_values($a);
$a[key($a)] = $m[count($m)-1];
end($a);
$a[key($a)]=$m[0];
print_r($a);
|
Надеюсь в этом случае вы меня не обвините в плагиате? :) | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 17:37)
| | в этом случае не обвиню, да и в том случае я не обвинял (это просто издержки форума Вы не совсем правильно меня интерпретируете), а просто сказал, что код идентичен, а я ждал от Вас другого решения, но array_slice() или array_pop() я в коде попрежнему не вижу и именно об этом я и говорил в самом начале.
цитирую сам себя:
вот мне и интересно как будет выглядеть код вспомнив о ключах
мне показалось что код будет сложнее, поэтому сразу отказался от array_pop
__
но reset() в код я всетаки добавил бы :) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 18:10)
| | А вы думаете я читать не умею, и буду пользоваться функциями, которые совсем не подходят для этого решения, полагая, что они универсальные? Я что на идиота похож, чтобы выдавать вам решение, используя array_slice() и array_pop() для обмена элементами значений? ;-)
PS. reset было бы добавлять, только в том случае, если с массивом работали (догадайтесь какими методами, а какие не повлияют в данном случае?), в примере я не вижу необходимости в этом. Коли бы я работал с ним, я бы добавил, а про запас, так это лишнее. | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 18:23)
| | ;-) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 18:26)
| | Валик, хватит гнать, пока у меня крыша не едет еще... | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 18:28)
| | Вы сами себя загоняете, я даже ничего не сказал, просто ответил одним Вашим постом, на другой Ваш пост :)
___
видать я много в детстве Эрла Стенли Гарднера начитался))) всегда нравились сцены перекрестного допроса ;) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 18:32)
| | И чем же вы ответили? Вы уж хотя бы конкретно скажите, чего вам в конце концов надо? Чтобы обязательно в коде использовать срез массива и выталкивание из него элементов?
Так какие проблемы, можно и зайдествовать, а разумно это будет? | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 18:52)
| | да тут я попять ошибся))) всетаки Вы там поменяли элементы массива, а не их значения, поэтому ответ постом на пост получился не корректным.
что мне надо? да ничего не надо кроме приятного разговора и установления истины :)
зато в ходе дискуссии мы нашли два решения, и возможно в скором времени договоримся до третьего :) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 18:58)
| | Ясно, короче пофлудить вам захотелось.
1. В исходной авторской задаче явно видно (ассоциация это только ваши предположения), что нужно просто поменять местами элементы индексного массива.
2. Поменяли.
3. Возник вопрос - "а если ассоциативный"?
4. Поменяли согласно задаче (меняем элементы местами, другого я пока ни от кого не слышал, включая и вас).
5. Оказывается требовалось сменить значения у ассоциаций (но это опять таки ваше предположение).
6. Бог с ним, выполнили и эту просьбу.
7. Оказывается опять не то сделали, вы ожидали, что будут применены прежние функции. Да пожайлуйста! Надо? | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 19:12)
| | нет не надо, если только Вы не собираетесь доказывать, что код будет проще предложенных.
4 пункт спорный и я Вам уже неоднократно говорил почему( см решение пункта 2, а также пункт 1 и пункт 4 явно противоречат друг другу... в первом вы меняете именно значения элементов, в 4-том сами элементы
В исходной авторской задаче явно видно, что нужно просто поменять местами элементы индексного массива
но поменяли-то вы значения.
).
__
не могу не сказать, уж простите, но решение предложенное мной лучше так как не зависит от размера массива... в Вашем случае дублируется массив, в итоге расход оперативки увеличивается в два раза. | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 19:23)
| | Как же вы достали, охота уже заматериться...
Я не менял значения! Я переставил элементы массива - ключ->значение!
А уж менял значения по вашей просьбе.
Ну блин, слов просто нет.
>не могу не сказать, уж простите, но решение предложенное мной лучше так как не зависит от размера массива...
Полнейшая чушь - этот код не зависит от размера массива. Ну вы бы хоть мозгами бы порасскинули, ну с чего это такое утверждение?
А вот экономия, так это уже иной вопрос, и рассматриваться должен в рамках конкретных условий. Собственно решений может быть не одно, если подумать, и ваш код не панацея, да и не лучший. | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 19:33)
| | и ваш код не панацея, да и не лучший
тогда не будте голословным укажите на недостатки
Как же вы достали, охота уже заматериться...
можете материться, у меня к этому иммунитет...
Я не менял значения!
меняли, и это очень легко доказать
при обращении к массиву по ключу:
в исходном массиве:
echo $a[0]; будет равно 9
echo $a[3]; будет равно 3
после преобразования:
echo $a[0]; будет равно 3
echo $a[3]; будет равно 9
Вы по-прежнему утверждаете что не меняли значения?
Полнейшая чушь - этот код не зависит от размера массива. Ну вы бы хоть мозгами бы порасскинули, ну с чего это такое утверждение?
с того что вы создаете индексную копию ассоциативного массива по средствам array_values
Ну блин, слов просто нет
ищите ибо я серьезно настроен разделать Вас под орех или висеть на Вашем щиту, третьего не дано :) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 19:48)
| | Значит так:
1. Код от 21.06.2010 в 14:30 не меняет значения, он меняет местами элементы массива, парой - ключ->значение! Это согласно логике вопроса автора.
2. Код от 21.06.2010 в 17:37 меняет значения крайних элементов массива!
3. То что код не будет работать с любой длиной массива, это полнейший бред.
4. Вас беспокоит расход памяти? Так извените, у вас к заврашнему еще какие либо притензии появяться, а чтобы их не было, пожайлуйста:
<?
$a= array('a'=>9, 'b'=>15, 'c'=>21, 'd'=>3, 'e'=>23, 'f'=>45, 'g'=>234);
$m = array(current($a), array_values(array_slice($a,-1)));
$a[key($a)] = $m[1][0];
end($a);
$a[key($a)]=$m[0];
print_r($a);
?>
|
Ну что попусту молотить то? Загляните в мануал - ваш код не панацея, и не из лучших. | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 20:16)
| | 3. То что код не будет работать с любой длиной массива, это полнейший бред.
ткните пальцем где Вы это прочитали, а то может я сошел с ума и у меня раз(n)ение личности.
Но память в любом случае не ризиновая и в Вашем случае шансов выйти за ее пределы ограничения объема ровно в 2 раза больше в отличии от моего (касательно предыдущего скрипта).
4. Вас беспокоит расход памяти?
смею утверждать что это должно волновать каждого на этом форуме.
__
рабочий день закончен, поеду домой анализировать Ваш последний скрипт.
(продолжение следует) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 20:30)
| | >3. То что код не будет работать с любой длиной массива, это полнейший бред.
>ткните пальцем где Вы это прочитали, а то может я сошел с ума
А вот это я придумал, да?:
>автор: Valick (21.06.2010 в 19:23)
>не могу не сказать, уж простите, но решение предложенное мной лучше
>так как не зависит от размера массива...
>4. Вас беспокоит расход памяти?
>смею утверждать что это должно волновать каждого на этом форуме.
Для этого стоило просто заглянуть в мануал, и продолжения этой бессмысленной дискусси не было бы. | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 20:35)
| | Сим, я прекрасно понимаю, что вырывать фразу из контекста и трактовать её так как вам угодно это Ваше любимое занятие, но даже при таком раскладе, я настаиваю, укажите где именно я написал строчку Ваш код не будет работать с большим массивом (этот пост не считается)
Для этого стоило просто заглянуть в мануал, и продолжения этой бессмысленной дискусси не было бы.
Прошу впредь не посылать меня в мануал (я Вас туда никогда не посылал) не указывая четкую ссылку. Идеальным было бы предложение с краткой выпиской из мануала и ссылку на него же. Без этого это громкий ба-бах в чистое небо холостыми патронами. | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 21:33)
| | Валик, ну вы молодец. А как я должен понимать слова, что ваш код лучше, так как не зависит от длины массива? Ведь следует полагать, что то, что я написал, зависит от длины его, то есть не будет работать с любой длиной массива. Вы уж тогда не изъясняйтесь эзоповым языком, а выражайтесь более ясно, если ваши речи выражают не то, о чем могут подумать.
А заглядывать в мануал, это что постыдно? Я лично так не считаю. Запоминается хорошо то, что часто используется, да и то иногда можно и кое что перепутать тоже. Разве обязательно изучать все, что он содержит, наизусть?
Я вижу у автора массив с четырмя элементами. А стоит ли думать в данном случае об экономии? Вы думаете выигрыш будет? Проверьте, вот эта запись:
$a= array('a'=>9, 'b'=>15, 'c'=>21, 'd'=>3);
$m = array_values($a);
|
будет расходовать меньше памяти, чем эта:
$a= array('a'=>9, 'b'=>15, 'c'=>21, 'd'=>3);
$m = array(current($a), array_values(array_slice($a,-1)));
|
К тому же, во втором случае требуется больше работы. Стоит ли овчинка выделки? Другой вопрос, если речь идет о большом объеме данных, но неуж-то вы не знаете, что можно получить некоторые элементы массива? Знаете конечно, ну а какими путями это можно сделать, так и в мануал можно заглянуть, чтобы выбрать лучшее. Вот я вам и посоветовал. | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 21:55)
| | А как я должен понимать слова, что ваш код лучше, так как не зависит от длины массива?
именно так как я написал, в Вашем случае расход памяти увеличивается прямо пропорционально величине массива...
Другой вопрос, если речь идет о большом объеме данных
нет это не другой вопрос, а именно об этом и идет речь.
но неуж-то вы не знаете, что можно получить некоторые элементы массива?
знаю, и написал код в самом начале дискуссии (код номер 2)
Знаете конечно, ну а какими путями это можно сделать, так и в мануал можно заглянуть
именно это я и написал, цитирую:
1код голова-мануал, 2 код голова+мануал
Я вижу у автора массив с четырмя элементами. А стоит ли думать в данном случае об экономии?
однозначно да (курочка по зёрнышку) - РНР это язык в котором требуется самодисциплина (это не я сказал, если не ошибаюсь об этом упоминал Д.Котеров)
а выражайтесь более ясно, если ваши речи выражают не то, о чем могут подумать
я вижу что Вы меня не понимаете, но почему это происходит я понять не могу.
А заглядывать в мануал, это что постыдно?
нет не постыдно, но почему Вы упорно считаете, что я туда не заглядываю, для меня остается загадкой.
Валик, ну вы молодец
спасибо :) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 22:25)
| | Валик, вас несет... ;-)
РНР, это язык изобилующий лишними функциями, поэтому в нем можно писать код:
сверху-вниз
снизу-вверх
слева-направо
.....
Это сказал я. Что там сказал Котеров, мне по-барабану.
А вот думать об экономии, так надо сперва подумать, стоить ли думать в конкретном случае. Не беспокойтесь, не только вы этим озабочены. | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 15:59)
| | а вот Вам значения Вашего первого кода
до Array ( [0] => 9 [1] => 15 [2] => 21 [3] => 3 )
после Array ( [0] => 3 [1] => 15 [2] => 21 [3] => 9 )
здесь Вы почему-то поменяли именно значения элементов массива (чего собственно по моему разумению и хотел автор)
потом я Вас попросил сделать тоже самое но с ассоциативным массивом
вместо этого Вы написали алгоритм с совершенно другой логикой...
___
ахинея? | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 15:59)
| | А не лучше ли было вообще-то тогда удалить? :)) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 13:18)
| |
<?
function array_first_end_change($a)
{
$f = array_shift($a);
$e = array_pop($a);
$u = array_unshift($a,$e);
$p = array_push($a,$f);
return $a;
}
$ar = array(9, 15, 21, 3);
$res = array_first_end_change($ar);
print_r($res);
?>
|
А так?))) | |
|
|
|
|
|
|
|
для: ols
(21.06.2010 в 13:58)
| | тот же вопрос, что и к sim5 | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 14:00)
| | Авторя, явно, подразумевал неасоциативный массив исходя из примера. | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 13:18)
| | если только у Вас тоже такой странный массив завелся и скулит.
Потому что у тредстартера сама постановка проблемы такова, что явно в модели что-то нездоровое, и лечить начинать надо именно модель, а никак не код.
У Вас, я надеюсь, ничего подобного не болит происходит. | |
|
|
|
|
|
|
|
для: Trianon
(21.06.2010 в 14:06)
| | нет не завелся (более того я у автора пытаюсь выведать откуда ноги растут)
Вы припоминаете задачу когда нужно было определенным образом распределить массив почтовых адресов? вот там действительно было интересно (не смотря на то, что зачада за версту пахла спамом) | |
|
|
|
|
|
|
|
для: mabelrod
(21.06.2010 в 10:56)
| | Нужен порядок? Сортируйте. | |
|
|
|
|
|
|
|
для: sim5
(21.06.2010 в 12:01)
| | для Вас 9,15,21,3 - беспорядок, а 3,15,21,9 порядок? :)) | |
|
|
|
|
|
|
|
для: Valick
(21.06.2010 в 12:26)
| | И правда, девятка в уме затерялась. ) | |
|
|
|
|