Forum Webscript.Ru
Программирование => PHP => Тема начата: Pacher от 26 Июня 2002, 19:07:35
-
Есть ли функция которая возвращает не удаленнуй часть массива(array_slice) , а сам массив без удаленной части ?
Есть массив с новостями , нужно допустим удалить несолько елементов из середины массива , как это сделать ?
-
unset(), наверное.
А чем тебя не устраивает просмотреть список функций для работы с массивами самому?
-
Удалять отдельные элементы массива можно через unset()
Смотри пример на
http://www.php.net/manual/en/function.unset.php
-
http://www.php.net/array_splice
-
GotZfild
Эта функция возвращает тот кусок который взяла из массива , а мне нужна чтобы ф-я возвращала САМ массив без удаленного элемента .
-
если ты сделаешь unset() для тех элементов, которые нужно удалить, этих элементов в массиве больше не будет.
Здесь ненужна функция, которая фозвращает массив, у тебя ведь уже есть этот массив (без удаленного элемента), можешь его смело использовать
-
Макс
А нумирование эл-мов после удаления изметится ?
-
Ребят , попробовал использовать эту функцию .
Так попробовал , сяк попробовал но ниче не пашет .
Скрипт удаляет ВСЕ новости из файла и записывает туда слово Array .
Короче скрипт получает от другого скрипта цифру (номер новости кот. нужно удалить) получает в переменную $ form_value . И дальше по ходу скрипта должен удалить элементы массива и заново записать , но делает скрипт все иначе , как я уже выше написал .
Вот скрипт :
News Script
$body_file_name="hah.txt";
$cra=fopen($body_file_name,"r");
$sos=fread($cra,64096);
$body_file_data=explode("|",$sos);
$name_of_file="na_na.txt";
$huy=fopen($name_of_file,"r");
$sux=fread($huy,64096);
$file_data=explode("|",$sux);
$form_value=$per;
$num=$per-1;
unset($body_file_data[$num]);
unset($file_data[$num],$file_data[$form_value]);
$to_body_file=implode("|",$body_file_data);
$to_file=implode("|",$file_data);
$last=fopen($body_file_name,"w");
$set=fputs($last,$body_file_data);
$hud=fopen($name_of_file,"w");
$ser=fputs($hud,$file_data);
fclose($cra);
fclose($last);
fclose($huy);
fclose($hud);
?>
-
Эта функция возвращает тот кусок который взяла из массива , а мне нужна чтобы ф-я возвращала САМ массив без удаленного элемента
Возвращает-то да. Но в исходном массиве уже не останется удаленного подмассива. То есть:$array = array("a", "b", "c", "d", "e");
$sub = array_splice($array, 1, 2);
print_r($sub);
print_r($array);
Выведет
Array
(
[0] => b
[1] => c
)
Array
(
[0] => a
[1] => d
[2] => e
)
-
GotZfild
Вот , попробовал с той функцией кот . ты советуешь .
Получился такой код :
$body_file_name="hah.txt";
$cra=fopen($body_file_name,"r");
$sos=fread($cra,64096);
$body_file_data=explode("|",$sos);
$name_of_file="na_na.txt";
$huy=fopen($name_of_file,"r");
$sux=fread($huy,64096);
$file_data=explode("|",$sux);
$form_value=$per;
$num=$per-1;
$garbage1=array_splice($body_file_data,$num);
$garbage2=array_splice($file_data,$num,$form_value);
$to_body_file=implode("|",$body_file_data);
$to_file=implode("|",$file_data);
$last=fopen($body_file_name,"w");
$set=fputs($last,$body_file_data);
$hud=fopen($name_of_file,"w");
$ser=fputs($hud,$file_data);
fclose($cra);
fclose($last);
fclose($huy);
fclose($hud);
?>
Но он ничего не делает ......
-
Пачер.
Самое главное в программировании - это отладка.
Разделить задачу на мелкие части, и убедиться, что каждая из них работает нормально.
Убери ты всю этту работу с файлами.
созждай тестовый массив, поработай с ним, выводя все на экран. А потом начинай работать с файлами.
А фраза "он ничего не делает" - это, извини, детский лепет.
Или заставь работать, или поищи себе другое занятие.
-
RomikChef
Будем отлаживать ...... но все таки array_splice как то не так работает :]]]
-
Во-первых, этот скрипт можно минимизировать:
$form_value = $per; // Не понял этих строк
$num = $per-1;
$files = array("hah.txt", \'na_na.txt\');
for ($i = 0; $i < sizeof($files); $i++) {
$file = $files[$i];
$fp = fopen($file, "r");
$data = fread($fp, 64096);
fclose($fp);
$data = explode("|", $data);
if ($file == "hah.txt") array_splice($data, $num);
else array_splice($data, $num, $form_value);
$fp = fopen($file, "w");
fputs($fp, implode("|", $data));
fclose($fp);
}
Во-вторых, структуру данных никто, кроме тебя, не знает, так что тут уж помочь вряд ли кто сможет.
Ошибки не выдаются?
И что это за строки, которых я не понял?
-
Перечитал твою предыдущую версию и понял: ты неправильно используешь array_splice. Второй параметр там - начало подмассива, а вот третий - длина этого самого подмассива, а не индекс удаляемого элемента.
-
GotZfild
$form_value = $per;
$form_value - в эту переменную передается цифра из формы .
А кстати вообще-то можно все это заменить на просто
$num = $form_value-1;
Формат данных в na_na.txt - дата|заголовок
Формат данных в hah.txt тело новости|тело второй новости итд
Насчет скрипта который ты привел - он ведь так же каки мой работает , только тут другой способ решения ...
Кстати , ты наисал так что скрипт пишет или в один файл или в другой , а надо чтоб в 2 файла (ну как у меня в скрипте) .
P.S. Сейчас убрал из своего скрипта все что касается файлов итд
и после выполнения array_splice()
написал , чтобы print_r выводила содержимое массива ....... и что вы думаете ? :) Массив до выполнения array_splice и после -НЕ ИЗМЕНИЛСЯ .
-
$form_value = $per;
$form_value - в эту переменную передается цифра из формы .
А зачем тогда $per?Кстати , ты наисал так что скрипт пишет или в один файл или в другой , а надо чтоб в 2 файла (ну как у меня в скрипте) .
Почему ИЛИ? Цикл выполняется два раза и пишет он, соответственно, такое же количество раз.Массив до выполнения array_splice и после -НЕ ИЗМЕНИЛСЯ
Перечитай еще раз (или больше) описание этой функции из Мана.
-
GotZfild
Блин , не пашет :)
Удаляет сразу весь массив .
-
Pacher
Еще раз покажи ее использование, значения переменных, которые в ней задействованы и что выводит.
-
Вот .
$num=$form_value-1;
/*
принимаемое значение уменшается на один , чтобы начать с цифры "0"
*/
array_splice($body_file_data,$num,0);
array_splice($file_data,$num,-1);
print_r $file_data;
/*
это просто чтобы посмореть
что сейчас в массиве находится
*/
print_r $body_file_data;
До выполнения и после нету никаких изменений , все так же , все элементы на месте и ничего не удаляется .
-
Все перепробовал , ничего не пашет ......
-
Pacher
Ты читал сообщения, которые до этого писались?
Каким образом длина вырезаемого массива может быть равной нулю или, тем более, минус единице?
Кроме того, аргумент у функции print_r берется в скобки.
-
GotZfild
Блин . так как тогда сделать ? :)
-
$length = 3; // например
array_splice($body_file_data,$num, $length );
array_splice($file_data,$num, $length );
Если тебе нужно вырезать один элемент, поставь в $length 1 и так далее.
-
Вот , я сделал так :
News Script
$body_file_name="hah.txt";
$cra=fopen($body_file_name,"r");
$sos=fread($cra,64096);
$body_file_data=explode("|",$sos);
$name_of_file="na_na.txt";
$huy=fopen($name_of_file,"r");
$sux=fread($huy,64096);
$file_data=explode("|",$sux);
if ($form_value==1)
{
$num=$form_value-1;
array_splice ($body_file_data, $num, 1);
array_splice ($file_data, $num, 2);
}
elseif ($form_value%2)
{
$www=$form_value-1;
array_splice ($body_file_data, $www, 1);
array_splice ($file_data, $form_value, 2);
}
else
{
$rrr=$form_value-1;
$qqq=$form_value+1;
array_splice ($body_file_data, $rrr, 1);
array_splice ($file_data, $qqq, 2);
}
$to_body_file=implode("|",$body_file_data);
$to_file=implode("|",$file_data);
$last=fopen($body_file_name,"w");
$set=fputs($last,$body_file_data);
$hud=fopen($name_of_file,"w");
$ser=fputs($hud,$file_data);
fclose($cra);
fclose($last);
fclose($huy);
fclose($hud);
?>
При вводе любого числа удаляется все по чистую из обоих файлов и пишется туда слово "Array" .
Ничего не понимаю .....
-
Ох, опять без дяди Маньяка не разберутся.... :)
Paсher, зайди на http://www.php.net, найди array_slice и посмотри в see also... Там есть функция array_splice...
Привожу кусок кода для демонстрации:
$rtfm=array("RTFM ","- ","Read ","the ","fucking ","manual ");
$word=array_splice($rtfm,2,4);
foreach ($word as $elem) print $elem;
print "
";
foreach ($rtfm as $elem) print $elem;
print "
";
?>
Выводит:
Read the fucking manual
RTFM -
Кстати, этот кусок кода я привел в качестве демонстрации (чтобы было максимально понятно). Обычно подобные задачи решаются так:
$rtfm="RTFM - read the fucking manual";
$rtfm=explode(" ",$rtfm);
print implode(" ",array_splice($rtfm,2,4))."
";
print implode(" ",$rtfm)."
";
;
Как видишь, пример стал короче на две строчки (это к вопросу про решение задачи разными способами в Оффтопике).
Ну и, наконец, если тебе не надо, чтобы бился исходный массив, то задача сокращается еще больше:
$rtfm="RTFM - read the fucking manual";
print implode(" ",array_splice(explode(" ",$rtfm),2,4))."
";
print $rtfm;
Выводит:
read the fucking manual
RTFM - read the fucking manual