[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: удалить массив из файла
Vikt0r
подскажите пожалуйта, как можно удалить массив из файла?

допустим имеем в файле mn.php такой код:

PHP
<? $mn = array( 
"1" => array(=> "меню 1"=> "тест 1"), 
"2" => array(=> "меню 2"=> "тест 2"), 
"3" => array(=> "меню 3"=> "тест 3"), 
"4" => array(=> "меню 4"=> "тест 4"), 
"5" => array(=> "меню 5"=> "тест 5"), 
); 


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

форма выглядит так:

PHP
<?
include(
'mn.php');

print 
"<form method='post'>";

foreach(
$mn as $aa => $bb)
{
print 
"<input type='checkbox' name='del[$aa]' value='$aa'> - $bb";
}

print 
"<input type='submit' name='ddel' value='удалить'>
</form>"
;

if(isset(
ddel))
{

# вот здесь нужно продолжить правильный код :-)

}


очень расчитываю на вашую помощь, спасибо!






Спустя 8 минут, 7 секунд (24.05.2009 - 00:02) kirik написал(а):
А что мешает просто создать новый массив (без ненужных строк) и записать его в файл mn.php?

Спустя 9 часов, 48 минут, 19 секунд (24.05.2009 - 09:50) Vikt0r написал(а):
Цитата (kirik @ 23.05.2009 - 21:02)
А что мешает просто создать новый массив (без ненужных строк) и записать его в файл mn.php?

если не затруднит вас, покажите пожалуйста это на примере, а то не очень понимаю.

в файле mn.php код должен быть таким какой он есть (массивным)...

у меня для него написан скрипт изменения и добавление массива в файл.

единственное что нужно, это теперь удалять массив по номерам:

"1" = array(....
"2" = array(....
"3" = array(....
"4" = array(....
"5" = array(....

либо же построчно, то есть:

строка 0 - это <? $mn = array(
строка 1 - это "1" = array(....
строка 2 - это "2" = array(....

и т.д.

Спустя 1 час, 6 минут, 31 секунда (24.05.2009 - 10:57) Vikt0r написал(а):
пробовал удалить построчно:
PHP
if(isset($ddel))
{
$file file('mn.php');
$fpdde fopen('mn.php''w+');
for(
$fd=0$fd<count($file); $fd++)
{
if(
$del[$fd] != "$fd")
{
fputs($fpdde$file[$fd]);
}
}
fclose($fpdde);
print 
"<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL=?\">";
}


удаляет, но не ту строку которую нужно....

пробовал корректировать строки с помощью $fd=1, скрипт рушится)

А причина в том, что в форме идет массивный Цикл, который считывает строки от 1! а в удалении For считывает строку от 0... и получается такой сдвиг, но как писал выше меняя на $fd=1 все рушится.

Спустя 10 часов, 11 минут, 47 секунд (24.05.2009 - 21:09) kirik написал(а):
Погляди:

PHP
header('Content-Type: text/html; charset=utf-8');

// Это исходный массив, который мы сами, руками сделали
$mn = array(
    
'1' => array(=> 'меню 1'=> 'тест 1'),
    
'2' => array(=> 'меню 2'=> 'тест 2'),
    
'3' => array(=> 'меню 3'=> 'тест 3'),
    
'4' => array(=> 'меню 4'=> 'тест 4'),
    
'5' => array(=> 'меню 5'=> 'тест 5'),
);
$kill '3'// это элемент меню, который нужно убить

echo '<b>Исходный массив</b><br /><pre>';
print_r($mn);
echo 
'</pre><br /><br />';

$from_file serialize($mn);
echo 
'<b>Массив такого вида, у нас был записан в файл, содержащий меню</b><br />'.$from_file.'<br /><br />';

$mn_new unserialize($from_file); // $from_file - сериализованный массив, считанный из файла, мы его возвращаем к виду массива
unset($mn_new[$kill]); // убиваем ненужный элемент
$to_file serialize($mn_new); // результат этого пишем обратно в файл

echo '<b>Новый массив такого вида, у нас будет записан в файл, содержащий меню</b> (как видно, уже с удаленным элементом)<br /><pre><br /><br />';
print_r($mn_new);
echo 
'</pre>';

echo 
'<b>Новый массив сериализованный массив такого вида, пишем в файл, содержащий меню</b><br />'.$to_file;


что не понятно, спрашивай! smile.gif

Спустя 1 час, 17 минут, 12 секунд (24.05.2009 - 22:26) Vikt0r написал(а):
Цитата (kirik @ 24.05.2009 - 18:09)
что не понятно, спрашивай! smile.gif

спасибо, работает!!!

еще очень интересует, как можно реализовать сортировку массивов способом перемешивания строки..

берем пример того же файла mn.php:

PHP
<? $mn = array( 
"1" => array(=> "меню 1"=> "тест 1"), 
"2" => array(=> "меню 2"=> "тест 2"), 
"3" => array(=> "меню 3"=> "тест 3"), 
"4" => array(=> "меню 4"=> "тест 4"), 
"5" => array(=> "меню 5"=> "тест 5"), 
);


нужно, чтобы при изменений значений: 1,2,3,4,5 менялись строки, например мы поменяли местами значения 2 и 4, должно выглядеть в файле так:

PHP
<? $mn = array( 
"1" => array(=> "меню 1"=> "тест 1"), 
"4" => array(=> "меню 4"=> "тест 4"), 
"3" => array(=> "меню 3"=> "тест 3"), 
"2" => array(=> "меню 2"=> "тест 2"), 
"5" => array(=> "меню 5"=> "тест 5"), 
);


или же 1 и 5, получаем:

PHP
<? $mn = array( 
"5" => array(=> "меню 5"=> "тест 5"), 
"2" => array(=> "меню 2"=> "тест 2"), 
"3" => array(=> "меню 3"=> "тест 3"), 
"4" => array(=> "меню 4"=> "тест 4"), 
"1" => array(=> "меню 1"=> "тест 1"), 
);


то есть меняем строки указанными местами и больше ничего.

заранее спасибо!

Спустя 2 часа, 36 минут, 58 секунд (25.05.2009 - 01:03) kirik написал(а):
Свои мысли по этому поводу есть?

Спустя 17 минут, 57 секунд (25.05.2009 - 01:21) Vikt0r написал(а):
Цитата (kirik @ 24.05.2009 - 22:03)
Свои мысли по этому поводу есть?

если только теоритически помыслить :-)

например имеем в цикле форму

PHP
<form>
For // считываем строки

// ведем в цикле перечисление всех строк
Input = 1
Input 
= 2
Input 
= 3
Input 
= 4 
Input 
= 5
</form>


допустим меняем в форме Input = 2 на 4, а Input = 4 на 2

далее скрипт должен определить (сравнить) эти строки и внести изменения по этим же двум строкам, а остальные записи без изменений сохраняются (перезаписываются).

реально вообще такое сделать?

Спустя 17 минут, 34 секунды (25.05.2009 - 01:38) kirik написал(а):
Первый вариант (простой) - просто указать скрипту, в каком порядке должны следовать элементы в новом массиве:
PHP
$swap = array('2''5''3''4''1'); // в каком порядке должны следовать элементы

$new_mn = array();
$mn = array(
    
'1' => array(=> 'меню 1'=> 'тест 1'),
    
'2' => array(=> 'меню 2'=> 'тест 2'),
    
'3' => array(=> 'меню 3'=> 'тест 3'),
    
'4' => array(=> 'меню 4'=> 'тест 4'),
    
'5' => array(=> 'меню 5'=> 'тест 5'),
);

for(
$i 0$c count($swap); $i $c$i++)
{
    
$new_mn[$swap[$i]] = $mn[$swap[$i]];
}

echo 
'<pre>';
print_r($new_mn);


Второй вариант (по-сложнее) - когда мы указываем, какие элементы исходного массива нужно поменять местами:
PHP
$swap = array('4''1'); // что меняем местами (порядок чисел может быть любой)

$new_mn = array();
$mn = array(
    
'1' => array(=> 'меню 1'=> 'тест 1'),
    
'2' => array(=> 'меню 2'=> 'тест 2'),
    
'3' => array(=> 'меню 3'=> 'тест 3'),
    
'4' => array(=> 'меню 4'=> 'тест 4'),
    
'5' => array(=> 'меню 5'=> 'тест 5'),
);

foreach(
$mn as $key => $val)
{
    if(
in_array($key$swap))
    {
        
$r = (array_search($key$swap) === 0) ? 0;
        
$new_mn[$swap[$r]] = $mn[$swap[$r]];
    }
    else
    {
        
$new_mn[$key] = $val;
    }
}
echo 
'<pre>';
print_r($new_mn);

Спустя 7 часов, 20 минут, 46 секунд (25.05.2009 - 08:59) glock18 написал(а):
Если не важно какие элементы будут переставлена, но важно чтобы они были переставлены, можно использовать
Код
array shuffle($array);

Спустя 1 час, 14 минут, 30 секунд (25.05.2009 - 10:14) sergeiss написал(а):
А можно, я "свою ИМХУ" выскажу? Почему бы не расположить это меню в файле с другой структурой? Чисто данные, безо всяких лишних буковок.
Типа такого:
Код
1;меню 1;тест 1
2;меню 2;тест 2
3;меню 3;тест 3
4;меню 4;тест 4
5;меню 5;тест 5

Тогда с этими данными будет намного проще работать, всё автоматизируется "на счёт раз".


Спустя 4 часа, 27 минут, 44 секунды (25.05.2009 - 14:41) Vikt0r написал(а):
Цитата (sergeiss @ 25.05.2009 - 07:14)
А можно, я "свою ИМХУ" выскажу? Почему бы не расположить это меню в файле с другой структурой? Чисто данные, безо всяких лишних буковок.
Типа такого:
Код
1;меню 1;тест 1
2;меню 2;тест 2
3;меню 3;тест 3
4;меню 4;тест 4
5;меню 5;тест 5

Тогда с этими данными будет намного проще работать, всё автоматизируется "на счёт раз".

Я согласен с вами, но так получилось, что у меня сайт уже настроен на массивы, и много чего проделано, как добавление массива, редактирование, удаление , по этому не хочется вникаться в новые проблемы для работы с файлами.

никогда не думал, что с массивами могут быть такие проблемы) даже с одним добавлением...

Спустя 8 минут, 52 секунды (25.05.2009 - 14:50) sergeiss написал(а):
Не понял... А что, куча данных хранится в таком виде? blink.gif blink.gif blink.gif

Тогда вообще непонятно. Почему не используется БД? Это намного надёжнее, чем работа с файлами.

Спустя 3 часа, 22 минуты, 9 секунд (25.05.2009 - 18:12) Vikt0r написал(а):
Цитата (sergeiss @ 25.05.2009 - 11:50)
Не понял... А что, куча данных хранится в таком виде? blink.gif blink.gif blink.gif

Тогда вообще непонятно. Почему не используется БД? Это намного надёжнее, чем работа с файлами.

нет, на массивах сделана только менюшка, разделы... а на сайте уже подстроены циклы отображения меню, а также администрирование ее через массивы. переписывать все уже нету смысла.

спасибо, ваши скрипты работают, последний (сложный способ) на практике пока не проверял...
Быстрый ответ:

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