В ниже приведенном коде есть строка удаления, там всё просто и стандартно...
unset($arr[$numberi]);
По и деи должна удаляться только строка с $numberi, но удаляется и эта строка и ВСЕГДА + ещё последняя!!!
В чём может быть ошибка?!
Массив формируется таким скриптом:
$i = count($arr);
echo "элемент $i";
$txet="<form method='post'><input type='hidden' name='numberi' value='".$i."'><input class='remov' type='submit' value=' '></form>";
$arr[$i]="$text $txet";
Удаление таким:
if (isset($_POST['numberi'])) {
$numberi = $_POST['numberi'];
unset($arr[$numberi]);
unset($_POST[numberi]);
}
for ($i = 0; $i < count($arr); $i++) {
if (!empty($arr[$i])) {
echo "$arr[$i]<p>";
$listarr = "$listarr $arr[$i]";
}
else {}
}
if (!isset($listarr)) {
echo "(Ваша корзина пуста)";
}
$_SESSION['mas']=$arr;
}
Спустя 11 минут, 48 секунд (2.11.2010 - 21:24) ИНСИ написал(а):
slavikx3m что именно ты хочешь сделать? задача скрипта какова?
Спустя 6 минут, 13 секунд (2.11.2010 - 21:30) slavikx3m написал(а):
Цитата (welbox2 @ 2.11.2010 - 18:24) |
slavikx3m что именно ты хочешь сделать? задача скрипта какова? |
ТЗ в тот чтобы удалить только тот элемент в массиве под номером который несет переменная $numberi....
Если даже руками вписать вместо $numberi любое число, то происходит тоже самое, а именно УДАЛЯЕТСЯ И ТОТ ЧТО НУЖНО УДАЛИТЬ и ПЛЮС ЕЩЁ ВСЕГДА ПОСЛЕДНИЙ ЭЛЕМЕНТ МАССИВА...
Спустя 5 минут, 50 секунд (2.11.2010 - 21:36) linker написал(а):
unset($_POST[numberi]); - это лишнее
$listarr = "$listarr $arr[$i]"; - хотя бы $listarr .= " " . $arr[$i];
и вообще не мешало бы дамп массива $arr и какие значения могут быть в $numberi
$listarr = "$listarr $arr[$i]"; - хотя бы $listarr .= " " . $arr[$i];
и вообще не мешало бы дамп массива $arr и какие значения могут быть в $numberi
Спустя 13 минут, 17 секунд (2.11.2010 - 21:49) slavikx3m написал(а):
Цитата (linker @ 2.11.2010 - 18:36) |
unset($_POST[numberi]); - это лишнее $listarr = "$listarr $arr[$i]"; - хотя бы $listarr .= " " . $arr[$i]; и вообще не мешало бы дамп массива $arr и какие значения могут быть в $numberi |
ну если дамп то пример для этого нужно ну тогда пример:
Лот 6 Дом Цена 45000<form method='post'><input type='hidden' name='numberi' value='".$i."'><input class='remov' type='submit' value=' '></form>
где
$text Лот 6 Дом Цена 45000
$txet <form method='post'><input type='hidden' name='numberi' value='".$i."'><input class='remov' type='submit' value=' '></form>
$numberi может быть любым целым числом о 0 до теоретически МНОГО...
Спустя 29 минут, 47 секунд (2.11.2010 - 22:19) SlavaFr написал(а):
используй foreach и увидеш, что последний елемент не стерт.
посуду сам, был аррей с 4 елементами первый имеет индекс 0 а последний индекс 3
потом ты стераеш один елемент, к прмеру 2-й (т.е по индексу 1), что приводит к тому, что count(array) вместо 4 только 3 показывает. твой цикл бжит следовательно максимум до елемента array[2] и таким образом не доходит до имеющегося елемнта по индексу 3.
в общем тебе @linker уже сказал, что ты var_dump зделать должен перед тем как в розыск на последний елемент подовать.
посуду сам, был аррей с 4 елементами первый имеет индекс 0 а последний индекс 3
потом ты стераеш один елемент, к прмеру 2-й (т.е по индексу 1), что приводит к тому, что count(array) вместо 4 только 3 показывает. твой цикл бжит следовательно максимум до елемента array[2] и таким образом не доходит до имеющегося елемнта по индексу 3.
в общем тебе @linker уже сказал, что ты var_dump зделать должен перед тем как в розыск на последний елемент подовать.
Спустя 11 часов, 27 минут, 36 секунд (3.11.2010 - 09:46) linker написал(а):
Читай SlavaFr тебе правильно истолковал. Удаляя элементы из массива индексы у оставшихся не меняются. Поэтом вместо цикла for() {} используй foreach() {}
Спустя 15 минут, 15 секунд (3.11.2010 - 10:02) slavikx3m написал(а):
Цитата (linker @ 3.11.2010 - 06:46) |
Читай SlavaFr тебе правильно истолковал. Удаляя элементы из массива индексы у оставшихся не меняются. Поэтом вместо цикла for() {} используй foreach() {} |
Я уже поблагодарил человека, foreach() помог в построении списка, но другая появилась проблема...
Теперь при удалении одного из центральных (одного из тех что между первым и последним элементом) элементов списка, скрипт записывает также новый элемент с новым индексом в конец, но через три добавления индекс перестаёт увеличиваться остаётся постоянным (и при выводе постоянное кол-во элементов в списке), а новый элемент выводиться не в конце, а заменяет один из центральных элементов списка...
Может вопрос решается наподобии:
вместо цикла for() {}используй foreach() {}
Но я не нашел другого способа внесения нового элемента в список...
$i = count($arr);
echo "элемент $i";
$arr[$i]="$text $txet";
Спустя 9 минут, 43 секунды (3.11.2010 - 10:11) linker написал(а):
$arr[] = "значение";PHP сам будет следить за индексами.
Спустя 7 минут, 2 секунды (3.11.2010 - 10:18) slavikx3m написал(а):
Цитата (linker @ 3.11.2010 - 07:11) |
$arr[] = "значение";PHP сам будет следить за индексами. |
Ну это мысль только, тогда как сказать unset($arr[$numberi]); строку под каким индексом я хочу удалить?
Спустя 2 минуты, 28 секунд (3.11.2010 - 10:21) slavikx3m написал(а):
$i = count($arr);
echo "элемент $i";
$txet="<form method='post'><input type='hidden' name='numberi' value='".$i."'><input class='remov' type='submit' value=' '></form>";
$arr[]="$text $txet";
ааааааааа или так? оставить подсчёт count($arr);, но использовать его только при присвоении кнопке переменной?
Во всяком случаи это позволит выявить скользкий вопрос индекса
Спустя 1 минута, 16 секунд (3.11.2010 - 10:22) linker написал(а):
В переменной $numberi ты должен передавать не номер элемента в массиве, а конкретный индекс.
Спустя 1 час, 58 минут, 19 секунд (3.11.2010 - 12:20) slavikx3m написал(а):
Цитата (linker @ 3.11.2010 - 07:22) |
В переменной $numberi ты должен передавать не номер элемента в массиве, а конкретный индекс. |
в PHP есть языковая конструкция для определения индекса элемента массива?
инет напичкан count()
Спустя 1 час, 34 минуты (3.11.2010 - 13:54) linker написал(а):
Начальное значение
$arr = array("Носки", "Трусы", "Панталоны");Вывод списка в корзине
$arr = $_SESSION['mas'];Удаление
if (!count($arr))
echo "(Ваша корзина пуста)";
else
{
foreach($arr as $index => $value)
{
echo "<form method='post'><input type='hidden' name='numberi' value='".$index."'>" .
"<input class='remov' type='submit' value=' '></form>";
}
}
$arr = $_SESSION['mas'];
unset($arr[$numberi]);
$_SESSION['mas'] = $arr;
Спустя 17 минут, 16 секунд (3.11.2010 - 14:12) slavikx3m написал(а):
Цитата (linker @ 3.11.2010 - 10:54) |
Начальное значение $arr = array("Носки", "Трусы", "Панталоны");Вывод списка в корзине $arr = $_SESSION['mas'];Удаление $arr = $_SESSION['mas']; |
Спасибо большое тебе!!! за терпение и за ум твой...
Пока что ждал ответа, не сидел без дела придумал немного проще того что ты привел в качестве решения моих проблем....
С учётом твоего опыта скажи, мой вариант удовлетворим, или слишком прост, слишком банален, слишком туп, ну или ещё слишком (без сарказма, просто интересно, код работает я проверил его)....
записали:
echo "элемент $i";
$txet="<form method='post'><input type='hidden' name='numberi' value='".$i."'><input class='remov' type='submit' value=''></form>";
$arr[$i]="$text $txet";
$i=$i+1;
foreach ($arr as $value) {
echo $value;
echo "<br>";
}
$_SESSION['mas']=$arr;
$_SESSION['i']=$i;
удалили:
if (isset($_SESSION['i'])) {$i=$_SESSION['i'];}
else {$i = "0";}
if (isset($_POST['numberi'])) {
$numberi = $_POST['numberi'];
unset($arr[$numberi]);
unset($_POST[numberi]);
}
Спасибо ещё раз!!!
Спустя 53 минуты, 12 секунд (3.11.2010 - 15:05) linker написал(а):
Слишком накручено. Смотри как все просто (в сокращенном виде)
$arr = $_SESSION['mas'];
switch($_POST['command'])
{
case 'add' :
{
$arr[] = $_POST['product'];
$_SESSION['mas'] = $arr;
break;
}
case 'delete' :
{
unset($arr[$numberi]);
$_SESSION['mas'] = $arr;
break;
}
}
if (!count($arr))
echo "(Ваша корзина пуста)";
else
{
foreach($arr as $index => $value)
{
echo "$value <form method='post'><input type='hidden' name='command' value='delete'>" .
"<input type='hidden' name='numberi' value='".$index."'>" .
"<input class='remov' type='submit' value='Удалить'></form>";
}
}