Forum Webscript.Ru

Программирование => PHP => Тема начата: Pacher от 26 Июня 2002, 19:07:35

Название: Есть ли такая функция ?
Отправлено: Pacher от 26 Июня 2002, 19:07:35
Есть ли функция которая возвращает не удаленнуй часть массива(array_slice) , а  сам массив без удаленной части ?
Есть массив с новостями , нужно допустим удалить несолько елементов из середины массива , как это сделать ?
Название: Есть ли такая функция ?
Отправлено: Меняздесьдавнонет от 26 Июня 2002, 21:43:12
unset(), наверное.
А чем тебя не устраивает просмотреть список функций для работы с массивами самому?
Название: Есть ли такая функция ?
Отправлено: ThE0ReTiC от 26 Июня 2002, 21:52:36
Удалять отдельные элементы массива можно через unset()
Смотри пример на
http://www.php.net/manual/en/function.unset.php
Название: Есть ли такая функция ?
Отправлено: GotZfild от 26 Июня 2002, 22:33:10
http://www.php.net/array_splice
Название: Есть ли такая функция ?
Отправлено: Pacher от 26 Июня 2002, 23:24:17
GotZfild
Эта функция возвращает тот кусок который взяла из массива , а мне нужна чтобы ф-я возвращала САМ массив без удаленного элемента .
Название: Есть ли такая функция ?
Отправлено: Макс от 26 Июня 2002, 23:50:13
если ты сделаешь unset() для тех элементов, которые нужно удалить, этих элементов в массиве больше не будет.
Здесь ненужна функция, которая фозвращает массив, у тебя ведь уже есть этот массив (без удаленного элемента), можешь его смело использовать
Название: Есть ли такая функция ?
Отправлено: Pacher от 27 Июня 2002, 01:04:40
Макс
А нумирование эл-мов после удаления изметится ?
Название: Есть ли такая функция ?
Отправлено: Pacher от 27 Июня 2002, 03:12:28
Ребят , попробовал использовать эту функцию .
Так попробовал , сяк попробовал но ниче не пашет .
Скрипт удаляет ВСЕ новости из файла и записывает туда слово Array .
Короче скрипт получает от другого скрипта цифру (номер новости кот. нужно удалить) получает в переменную $ form_value . И дальше по ходу скрипта должен удалить элементы массива и заново записать , но делает скрипт все иначе , как я уже выше написал .
Вот скрипт :



News Script<br />


$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);

?>




Название: Есть ли такая функция ?
Отправлено: GotZfild от 27 Июня 2002, 10:22:40
Цитировать
Эта функция возвращает тот кусок который взяла из массива , а мне нужна чтобы ф-я возвращала САМ массив без удаленного элемента

Возвращает-то да. Но в исходном массиве уже не останется удаленного подмассива. То есть:$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
)
Название: Есть ли такая функция ?
Отправлено: Pacher от 27 Июня 2002, 14:15:42
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);

?>


Но он ничего не делает ......
Название: Есть ли такая функция ?
Отправлено: Меняздесьдавнонет от 27 Июня 2002, 15:37:55
Пачер.
Самое главное в программировании - это отладка.
Разделить задачу на мелкие части, и убедиться, что каждая из них работает нормально.
Убери ты всю этту работу с файлами.
созждай тестовый массив, поработай с ним, выводя все на экран. А потом начинай работать с файлами.

А фраза "он ничего не делает" - это, извини, детский лепет.
Или заставь работать, или поищи себе другое занятие.
Название: Есть ли такая функция ?
Отправлено: Pacher от 27 Июня 2002, 16:47:29
RomikChef
Будем отлаживать ...... но все таки array_splice как то не так работает :]]]
Название: Есть ли такая функция ?
Отправлено: GotZfild от 27 Июня 2002, 17:02:08
Во-первых, этот скрипт можно минимизировать:
$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);
}
Во-вторых, структуру данных никто, кроме тебя, не знает, так что тут уж помочь вряд ли кто сможет.
Ошибки не выдаются?
И что это за строки, которых я не понял?
Название: Есть ли такая функция ?
Отправлено: GotZfild от 27 Июня 2002, 17:22:19
Перечитал твою предыдущую версию и понял: ты неправильно используешь array_splice. Второй параметр там - начало подмассива, а вот третий - длина этого самого подмассива, а не индекс удаляемого элемента.
Название: Есть ли такая функция ?
Отправлено: Pacher от 27 Июня 2002, 17:33:00
GotZfild


Цитировать
$form_value = $per;

$form_value - в эту переменную передается цифра из формы .
А кстати вообще-то можно все это заменить на просто
Цитировать
$num = $form_value-1;

Формат данных в na_na.txt - дата|заголовок
Формат данных в hah.txt тело новости|тело второй новости итд

Насчет скрипта который ты привел - он ведь так же каки мой работает , только тут другой способ решения ...
Кстати , ты наисал так что скрипт пишет или в один файл или в другой , а надо чтоб в 2 файла (ну как у меня в скрипте) .
P.S. Сейчас убрал из своего скрипта все что касается файлов итд
и после выполнения array_splice()
написал , чтобы print_r выводила содержимое массива ....... и что вы думаете ? :) Массив до выполнения array_splice и после -НЕ ИЗМЕНИЛСЯ .
Название: Есть ли такая функция ?
Отправлено: GotZfild от 27 Июня 2002, 19:13:04
Цитировать
$form_value = $per;
$form_value - в эту переменную передается цифра из формы .

А зачем тогда $per?
Цитировать
Кстати , ты наисал так что скрипт пишет или в один файл или в другой , а надо чтоб в 2 файла (ну как у меня в скрипте) .

Почему ИЛИ? Цикл выполняется два раза и пишет он, соответственно, такое же количество раз.
Цитировать
Массив до выполнения array_splice и после -НЕ ИЗМЕНИЛСЯ

Перечитай еще раз (или больше) описание этой функции из Мана.
Название: Есть ли такая функция ?
Отправлено: Pacher от 27 Июня 2002, 19:18:44
GotZfild
Блин , не пашет :)
Удаляет сразу весь массив .
Название: Есть ли такая функция ?
Отправлено: GotZfild от 27 Июня 2002, 19:24:51
Pacher
Еще раз покажи ее использование, значения переменных, которые в ней задействованы и что выводит.
Название: Есть ли такая функция ?
Отправлено: Pacher от 27 Июня 2002, 20:57:16
Вот .


$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 от 27 Июня 2002, 21:49:10
Все перепробовал , ничего не пашет ......
Название: Есть ли такая функция ?
Отправлено: GotZfild от 27 Июня 2002, 22:33:27
Pacher
Ты читал сообщения, которые до этого писались?
Каким образом длина вырезаемого массива может быть равной нулю или, тем более, минус единице?
Кроме того, аргумент у функции print_r берется в скобки.
Название: Есть ли такая функция ?
Отправлено: Pacher от 27 Июня 2002, 22:39:18
GotZfild
Блин . так как тогда сделать ? :)
Название: Есть ли такая функция ?
Отправлено: GotZfild от 27 Июня 2002, 22:47:41

$length = 3; // например
array_splice($body_file_data,$num, $length );
array_splice($file_data,$num, $length );
Если тебе нужно вырезать один элемент, поставь в $length 1 и так далее.
Название: Есть ли такая функция ?
Отправлено: Pacher от 28 Июня 2002, 03:55:42
Вот , я сделал так :





News Script<br />



$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" .
Ничего не понимаю .....
Название: Есть ли такая функция ?
Отправлено: Maniac от 28 Июня 2002, 11:47:38
Ох, опять без дяди Маньяка не разберутся.... :)
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