Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Функция сохранения в файл массива


Автор: Elfet 24.2.2008, 18:31
Код

    function savearray($name, $arr, $file)
    {
        function formarray($from)
        {
            $r = "array (";
            foreach($from as $key=>$value)
            {
                $r .= " '".$key."' => ";
                if(is_array($value))
                {
                    $r .= formarray($value);
                }
                else if(is_bool($value))
                {
                    $r .= $value?'true':'false';
                }
                else if(is_int($value))
                {
                    $r .= intval($value);
                }                
                else 
                {
                    $r .= "'".addslashes($value)."'";
                }
                $r .= ",";
            }
            $r .= ")";
            return $r;
        }

        $content = "<?php ";
        $content .= "$".$name." = ";
        $content .= formarray($arr); 
        $content .= "; ?>";
        
    if(!function_exists('file_put_contents')) {
        function file_put_contents($filename, $content)
        {
            if($fp = @fopen($filename, 'w')) {
                $result = fwrite($fp, $content);
                fclose($fp);
                return $result;
            } else {
                return false;
            }
        }
    }
    file_put_contents($file,$content);        
    }

Автор: GeneralElectric 24.2.2008, 18:56
Ужасно. 
Ужасны и предпосылки, которые привели к такому решению, и реализация, и полное игнорирование встроенных средств PHP.

Автор: flashaa 24.2.2008, 19:07
эээ.

Код

$arr = array();
file_put_contents('array.txt', serialize($arr));

Автор: CyClon 24.2.2008, 19:29
Депрессия? xD

Во-первых не вижу пользы от этой функции, во-вторых реализуется в 3 строчки тоже самое, в принципе.

Автор: smartov 24.2.2008, 19:47
Цитата(CyClon @  24.2.2008,  18:29 Найти цитируемый пост)
Депрессия? xD

Точно =)

Автор: CyClon 24.2.2008, 19:56
Немного подумав нашел ей применение: в недо-CMS так с конфигами мона работать, подставил значения с массива, нажал сохранить и он весь массив в файл записал %)

Автор: awers 24.2.2008, 20:34
OMG. Автор, настоятельный совет открыть учебник по PHP, расположенный по адресу php.net для ознакомления с функциями, предоставляемыми по умолчанию в PHP. 
flashaa, ответил на твой вопрос ...

Автор: Elfet 24.2.2008, 22:07
Конечно извращенство. 
Хочу проще сохранять настройки. Записать в php файл и подключать его где нужно. Что тут можно сделать? smile

Автор: awers 24.2.2008, 22:26
после минусов посу нехочу чем либо помогать...

Автор: smartov 25.2.2008, 00:15
Elfet, зачем? Лучше или записать в базу и с ней работать, или в xml, натравив на него http://ua.php.net/manual/en/ref.simplexml.php для считывания/записи.

Добавлено через 2 минуты и 2 секунды
Elfet, а то получается за один файл ты два раза велосипед изобрел. Сначала serialize переписал, а потом file_put_contents. 
Да и некошерно в 21 веке настроки по plain-text файлам пихать  smile сейчас рулят хранилища данных.

Автор: Elfet 25.2.2008, 14:39
smartov, это я всё конечно понимаю, но когда я пишу скрипт такого небольшого размера, то мне кажется излишним его усложнение всякими настройками в бд. Тут сделал include "settings.php" и всего делов.
Чем плох такой метод?

Автор: smartov 25.2.2008, 14:52
Elfet, 
Цитата(Elfet @  25.2.2008,  13:39 Найти цитируемый пост)
Чем плох такой метод?

Если скрипт небольшого размера то можно и include, а вот когда настроек около сотни или просто больше 20 то встает вопрос об их структурировании.

Только хотелось бы узнать как к include относится тот код, что у тебя в первом посте, и что ты вообще хотел им сказать smile

Автор: gta4kv 25.2.2008, 15:07
Elfet, 
Ты лучше перезаписывай только нужные строки, т.е ты делаешь редактор конфигурации, сравнивай строки после сохранения, нужные - меняй.
Так, имхо, будет лучше.

Код

$file = ( 'settings.php' );
$txt = ( file_get_contents( $file ) );
file_put_contents( $file, str_replace( $oldValue, $newValue, $txt ) );


Добавлено через 1 минуту и 59 секунд
А код из первого поста - фтопку.

Автор: Elfet 25.2.2008, 15:16
smartov, да, настроек-то всего-то 10-11 smile Первый листинг сохраняет массив настроек в файл которые потом я инклудю smile


gta4kv, чем лучше-то? smile

Автор: gta4kv 25.2.2008, 15:17
Elfet, удобнее, да и код в первом посте определенно не лучше, и массивнее. тут можно будет обойтись десятью строчками.

Автор: Elfet 25.2.2008, 15:22
Цитата(gta4kv @  25.2.2008,  16:07 Найти цитируемый пост)
str_replace( $oldValue, $newValue, $txt )

Было у меня в настройках три "1", а теперь там все "3" - кажется мне что этот код работать не будет smile

Автор: gta4kv 25.2.2008, 15:25
Цитата(Elfet @ 25.2.2008,  15:22)
Цитата(gta4kv @  25.2.2008,  16:07 Найти цитируемый пост)
str_replace( $oldValue, $newValue, $txt )

Было у меня в настройках три "1", а теперь там все "3" - кажется мне что этот код работать не будет smile

Ой, не подумал. и вправду. smile

Добавлено через 45 секунд
Хотя нет, подумал, щас напишу пример

Автор: gta4kv 25.2.2008, 15:48
Получилось не легче, но работает, ( записать правильно так и не удалось smile  все ок) 
Код

<fieldset>
    <form action="?me" method="post">
        lol: <input type="text" name="lol" /> <br />
        rofl: <input type="text" name="rofl" /> <br />
        elfet: <input type="text" name="elfet" /> <br />
        <input type="submit" value="test" />
    </form>
</fieldset>

<?php

$config = array(
    'lol' => 'loleng',
    'rofl' => 'rofoleng',
    'elfet' => 'elfeteng',
);

if( isset( $_GET['me'] ) )
{
    $key = array_keys( $_POST );
    $keys = array_keys( $config );

    $i = 0;
    $newconfig = $config;
    
    
    while( $i < count( $key ) - 1 )
    {
        $newconfig = str_replace( "'" . $key[ $i ] . '\' => \'' . $config[ $keys [ $i ] ] . "'",
                                  "'" . $key[ $i ] . '\' => \'' . $_POST[ $keys [ $i ] ] . "'\n", $newconfig );
        $i++;
    }
    
    
    $key = array_keys( $newconfig );
    $content = "<?php\n";
    $i = 0;
    $content .= '$config = array( ' . "\n";
    while ( $i < count( $key ) )
    {
        $content .= "'" . $key[ $i ] . '\' => \'' . $_POST[ $keys [ $i ] ] . ",'\n";
        $i++;
    }
    $content .= ");\n";
    $content .= '?>';
    
    file_put_contents( 'test.txt', $content );
}

    
?>


Добавлено @ 15:49
тут расчет идет что name'ы у полей, равны названиям полей конфига. все равно лучше чем твой первый пост)

Добавлено @ 15:51
Получилось не легче тока из-за проблемы записи массива в файл. smile

Автор: Elfet 25.2.2008, 17:05
gta4kv, нет, теперь мой лучше smile Что если в массиве ещё массивы? И теперь bool перейдет в 'bool' : true -> 'true' & 1 -> '1' ;)

Автор: smartov 25.2.2008, 17:07
Elfet, то есть для того, чтобы иметь возможность потом заинклудить файл ты изобрел велосипед два раза?
А нельзя было не изобретать ни разу но срхранять (просто для примера возьму) используя serialize, а там, где у тебя сейчас include делать unserialize?

Автор: Elfet 25.2.2008, 18:49
Почему два раза? Один smile 
Я сначала подключал файл настроек просто инклудом. Теперь захотел сделать админку где эти настройки можно было бы испавить.

PS Меня ещё интересует насколько опасно таким кодом пользоваться? smile

Автор: smartov 26.2.2008, 12:45
Цитата(Elfet @  25.2.2008,  17:49 Найти цитируемый пост)
Почему два раза? Один 

1) сериализация
2) file_put_contents

Автор: Vaulter 26.2.2008, 13:07
а не проще все хранить в таблице... variables?

Автор: Elfet 26.2.2008, 17:48
Цитата(smartov @  26.2.2008,  13:45 Найти цитируемый пост)
2) file_put_contents 

Это что бы в php4 работало. Разве не так? smile

Автор: smartov 26.2.2008, 18:58
Elfet, а у тебя что php4? ;) 

Автор: Arhar 26.2.2008, 19:56
где вы видите в этом коде сериализацию???
это запись в формате
Код

<?php
$name=array(
'key1'=>array(
'innerkey'=>'innervalue',
),
'key2'=>'true',
'key3'=>10,
'key4'=>'text',
);
?>

и потом делая
Код

include 'settings.php'

получаем в скрипте сразу
Код

$name['key1']['innerkey']=='innervalue'



вариант проще - 
записывать в формате
Код

<?php
$name = 'сериализованныймассив';
?>

тогда в скрипте после инклюда надо просто делать unserialize

Автор: gta4kv 26.2.2008, 20:04
Цитата(smartov @ 26.2.2008,  18:58)
Elfet, а у тебя что php4? ;)

У него так что бы работало на всех версия. ;)

Автор: smartov 27.2.2008, 12:27
Цитата(Arhar @  26.2.2008,  18:56 Найти цитируемый пост)
где вы видите в этом коде сериализацию???

Сериализация не есть "четко закрепленный алгоритм". 

Цитата(gta4kv @  26.2.2008,  19:04 Найти цитируемый пост)
У него так что бы работало на всех версия. ;)

В третей работать не будет. Ее тоже поддержать? smile
ИМХО не совсем верное решение поддерживать PHP4, если только на это нет каких-то острых причин. PHP5 уже много лет. PHP6 на носу. 

Автор: Arhar 28.2.2008, 11:17
Цитата

Сериализация не есть "четко закрепленный алгоритм". 

ммм...в контексте форума php?
раз в языке есть функция serialize, то говоря "сериализация" наверно подразумевается результат именно этой функции, разве нет?

Автор: smartov 28.2.2008, 12:33
Arhar, говоря сериализация я подразумеваю http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F, а не функцию serialize которая является одной из реализаций сериализации.
(Блин сильно много окончаний "ция" получилось )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)