[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удаление из массива ЗАГАДОЧНЫЙ ТВИК
slavikx3m
Помогите пожалуйста, может кто знает.....

В ниже приведенном коде есть строка удаления, там всё просто и стандартно...

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

Спустя 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='&nbsp;'></form>

где

$text Лот 6 Дом Цена 45000

$txet <form method='post'><input type='hidden' name='numberi' value='".$i."'><input class='remov' type='submit' value='&nbsp;'></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 зделать должен перед тем как в розыск на последний елемент подовать.

Спустя 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'];
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;

Спасибо большое тебе!!! за терпение и за ум твой...

Пока что ждал ответа, не сидел без дела придумал немного проще того что ты привел в качестве решения моих проблем....

С учётом твоего опыта скажи, мой вариант удовлетворим, или слишком прост, слишком банален, слишком туп, ну или ещё слишком (без сарказма, просто интересно, код работает я проверил его)....


записали:

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>";
}
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.