powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Разминка для мозгов
25 сообщений из 271, страница 9 из 11
(PHP) Разминка для мозгов
    #37195997
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, запустил код panandy , получил так:

Код: plaintext
1.
2.
3.
4.
5.
6.
        ["port"]=>
        string( 6 ) "1111
"
        ["id"]=>
        string( 10 ) "session1
"

А мои выдают:

Код: plaintext
1.
2.
3.
4.
5.
6.
        ["port"]=>
        string( 5 ) "1111
"
        ["id"]=>
        string( 9 ) "session1
"

Т.е. explode тянет перевод строки, если конфиг с виндовыми \n, а регулярки не тянут, т.е. выходит предпочтительнее.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196015
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет. Если быть точнее, при UNIX EOL получаю регулярками:
Код: plaintext
1.
        ["id"]=>
        string( 8 ) "session1"

При WIN EOL регулярками:
Код: plaintext
1.
2.
        ["id"]=>
        string( 9 ) "session1
"

Ну а при построчной обработке - 9 и 10 соответственно.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196022
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. при любом EOL-е при построчной обработке получаем захват EOL-а в данные
А с регулярками, либо правильно, либо пол-EOL-а )))
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196046
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Затестил так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
$count =  10000 ;
$text  =  file_get_contents ('config.txt');
$lines =  file ('config.txt');


 sleep ( 1 );
$time_a =  microtime ( true );
 for ($i =  0 ; $i < $count; ++$i)
{
	$res = read_conf_a($text);
}
$time_a =  microtime ( true ) - $time_a;


 sleep ( 1 );
$time_b =  microtime ( true );
 for ($i =  0 ; $i < $count; ++$i)
{
	$res = read_conf_b($text);
}
$time_b =  microtime ( true ) - $time_b;


 sleep ( 1 );
$time_c =  microtime ( true );
 for ($i =  0 ; $i < $count; ++$i)
{
	$res = read_conf_c($lines);
}
$time_c =  microtime ( true ) - $time_c;

Где read_conf_c - это его код. Увы. eval вообще никакой критики не выдерживает. А регулярка чуть медленее вышла (иногда одинаковые результы показывает):

Код: plaintext
1.
2.
3.
4.
 count = 10000 
time_a =  1 . 96526193619 
time_b =  0 . 995101928711 
time_c =  0 . 893173933029 
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196049
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА регулярка чуть медленее вышла
В смысле, регулярка и там, и там. А имелось ввиду "регулярка без eval-a, а с циклом.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196130
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragon,

вот такие вот косяки я считал за помарки и исправлял в коде у хабровцев (у 4 или 5 была такая помарка).
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196135
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragon,

меня чуть-чуть обогнал (на самом деле между запусками ты или на несколько сотых быстрее моего или на несколько сотых медленнее; panandy всегда обгоняет и тебя и меня )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
php test.php  10000 
an0nym's implementation returns right result: 0 7384 0 688 2.33
Ackrite@habr's implementation returns right result:  0   2248   0   0   3 . 11 
Ference@habr's implementation returns right result: 0 0 0 0 6.25
0lympian@habr's implementation returns right result:  0   0   0   0   2 . 49 
iSage@habr's implementation does not return right result
MaxHero@habr's implementation returns right result:  0   0   0   0   3 . 29 
yadeveloper@habr's implementation returns right result: 0 0 0 0 4.07
alexxz@habr's implementation returns right result:  0   0   0   0   2 . 9 
panandy@habr's implementation returns right result: 0 0 0 0 2.2
bogus92@habr's implementation returns right result:  0   192   0   0   4 . 31 
Zayaz@habr's implementation returns right result: 0 0 0 0 3.01
sectronix@habr's implementation returns right result:  0   656   0   0   3 . 39 
Azilot@habr's implementation does not return right result
mcdb@habr's implementation returns right result:  112459776   60092320   112459776   60092280   4 . 08 
mcdb@habr: 2 's implementation returns right result: 262144 92704 262144 84128 3.78
tzlom@habr's implementation returns right result:  0   88   0   0   2 . 66 
nik1550@habr's implementation returns right result: 0 80 0 0 3.18
BVadim@habr's implementation returns right result:  0   0   0   0   2 . 58 
Edd.Dragon's implementation returns right result: 0 824 0 0 4.34
Edd.Dragon:2's implementation returns right result:  0   376   0   0   2 . 29 
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196138
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
<?php
error_reporting(- 1 );
ini_set("display_errors", true);
$input = "config.txt";
$output_right = array(
    "id" => "www",
    "session" => array(
        "timeout" => "120",
        "server" => array(
             0  => array(
                "host" => "127.0.0.1",
                "port" => "1111",
                "id" => "session1"
            ),
             1  => array(
                "host" => "127.0.0.1",
                "port" => "1111",
                "id" => "session2"
            )
        )
    ),
    "image" => array(
        "width" => "640",
        "height" => "480",
        "watermark" => array(
            "small" => "wsmall.png",
            "normal" => "wnormal.png"
        )
    )
);

$implementations["an0nym"] = function ($filename) {
    $result = array();
    foreach (file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
        $route_value = explode("=", $line);
        $last = strtok($route_value[ 0 ], ".");
        $reference = &$result[$last];
        while (($last = strtok(".")) !== false)
            $reference = &$reference[$last];
        $reference = $route_value[ 1 ];
    }
    return $result;
};

$implementations["Ackrite@habr"] = function ($filename) {
    $str = file($filename);
    $result = array();
    foreach ($str as $line) {
        $line = trim($line);
        if ($line == '') {
            continue;
        }
        list($k, $v) = explode("=", $line,  2 ) + array("", "");
        $k = explode('.', $k);
        $cc = &$result;
        for ($i =  0 ; $i < count($k); $i++) {
            if (!isset($c[$k[$i]]))
                $c[$k[$i]] =  0 ;
            $cc = &$cc[$k[$i]];
        }
        $cc = $v;
        unset($cc);
    }
    return $result;
};

function array_merge_recursive_distinct() {
    $arrays = func_get_args();
    $base = array_shift($arrays);
    if (!is_array($base))
        $base = empty($base) ? array() : array($base);
    foreach ($arrays as $append) {
        if (!is_array($append))
            $append = array($append);
        foreach ($append as $key => $value) {
            if (!array_key_exists($key, $base) and !is_numeric($key)) {
                $base[$key] = $append[$key];
                continue;
            }
            if (is_array($value) or is_array($base[$key])) {
                $base[$key] = array_merge_recursive_distinct(isset($base[$key]) ? $base[$key] : null, $append[$key]);
            } else if (is_numeric($key)) {
                if (!in_array($value, $base))
                    $base[] = $value;
            } else {
                $base[$key] = $value;
            }
        }
    }
    return $base;
}
$implementations["Ference@habr"] = function ($path) {
    $output = array();
    $file = fopen($path, 'r');
    while ($row = fgets($file)) {
        $row = rtrim($row, "\n");
        list($key, $value) = explode('=', $row);
        $path = explode('.', $key);
        $path = array_reverse($path);
        $tmp = $value;
        foreach ($path as $v) {
            $tmp = array($v => $tmp);
        }
        $output = array_merge_recursive_distinct($output, $tmp);
    }
    fclose($file);
    return $output;
};

function parseline($conf, $line) {
    list($key, $val) = explode('=', $line,  2 );
    $keypath = explode('.', $key);
    $cconf = &$conf;
    foreach ($keypath as $k)
        $cconf = &$cconf[$k];
    $cconf = $val;
}
$implementations["0lympian@habr"] = function ($filename) {
    $conf = array();
    $configtext = file_get_contents($filename);
    foreach (explode("\n", $configtext) as $l) {
        $l = trim($l);
        if ($l)
            parseline(&$conf, $l);
    }
    return $conf;
};

$implementations["iSage@habr"] = function ($fname) {
    $data = file($fname, FILE_IGNORE_NEW_LINES);
    $conf = array();
    foreach ($data as $line) {
        $value = explode('=', $line,  2 );
        $name = $value[ 0 ];
        $value = $value[ 1 ];
        $path = array_reverse(explode('.', $name));
        $end = $value;
        foreach ($path as $path_part) {
            $tmp = array();
            $tmp[$path_part] = $end;
            $end = $tmp;
        }
        $conf = array_merge_recursive($end, $conf);
    }
    return $conf;
};

function addToDictionary(&$array, $keyArray, $value) {
    if (count($keyArray) >  1 ) {
        /*if (!isset($array[$keyArray[0]])) {
            $array[$keyArray[0]] = array();
        }*/
        $partOfKey = array_shift($keyArray);
        addToDictionary($array[$partOfKey], $keyArray, $value);
    } else {
        $array[$keyArray[ 0 ]] = $value;
    }
}
$implementations["MaxHero@habr"] = function ($filename) {
    $result = array();
    $fp = fopen($filename, "r");
    while (!feof($fp)) {
        $line = fgets($fp); //Считываем новую строку конфига
        $line = rtrim($line, "\n");
        if ($line) {
            $keyValueArray = explode("=", $line); //Отделяем ключ от значения
            $keyArray = explode(".", $keyValueArray[ 0 ]); //Отделяем части ключа
            addToDictionary($result, $keyArray, $keyValueArray[ 1 ]); //Добавляем в массив
        }
    }
    fclose($fp);
    return $result;
};

$implementations["yadeveloper@habr"] = function ($filename) {
    foreach (parse_ini_file($filename) as $key => $value) {
        $key = vsprintf('$result["%s"] = "%s";', array(str_replace('.', '"]["', $key), $value,));
        eval($key);
    }
    return $result;
};

$implementations["alexxz@habr"] = function ($f) {
    $lines = file($f);
    $result = array();
    foreach ($lines as $line) {
        $line = trim($line);
        $eqpos = strpos($line, '=');
        if ($eqpos === false || $eqpos ===  0 )
            continue;
        list($key, $value) = explode('=', $line);
        $key = trim($key);
        $value = trim($value);
        $parts = explode('.', $key);
        $iterator = &$result;
        foreach ($parts as $part) {
            if (!isset($iterator[$part])) {
                $iterator[$part] = array();
            }
            $iterator = &$iterator[$part];
        }
        $iterator = $value;
    }
    return $result;
};

$implementations["panandy@habr"] = function ($filename) {
    $lines = file($filename, FILE_IGNORE_NEW_LINES);
    $result = array();
    foreach ($lines as $line) {
        $parts = explode('=', $line,  2 );
        $path = explode('.', $parts[ 0 ]);
        $r = &$result;
        foreach ($path as $q) {
            $r = &$r[$q];
        }
        $r = $parts[ 1 ];
    }
    return $result;
};

$implementations["bogus92@habr"] = function ($fn) {
    $file = file($fn);
    $config = array();
    foreach ($file as $line) {
        $line = explode("=", $line);
        $key = $line[ 0 ];
        unset($line[ 0 ]);
        $value = trim(implode("=", $line));
        $key = explode(".", $key);
        $str = '$config';
        foreach ($key as $l) {
            $str .= "['$l']";
        }
        $str .= " = '$value';";
        eval($str);
    }
    return $config;
};

$implementations["Zayaz@habr"] = function ($file_name) {
    parse_str(implode("&", array_map(function($line) {
        return preg_replace('/\.([^\.=]+)/i', '[\\1]', substr($line,  0 , strpos($line, '='))) . substr($line, strpos($line, '='));
    }, file($file_name, FILE_IGNORE_NEW_LINES))), $data);
    return $data;
};

$implementations["sectronix@habr"] = function ($file_name) {
    return eval(preg_replace_callback('/(.+?)=(.+)/', function($m) {
        return '$r["' . str_replace('.', '"]["', $m[ 1 ]) . '"]="' . $m[ 2 ] . '";';
    }, file_get_contents($file_name)) . 'return $r;');
};

$implementations["Azilot@habr"] = function ($fname) {
    $result = array();
    $fp = fopen($fname, "r");
    while ($line = fgets($fp)) {
        if (trim($line) == '')
            continue;
        list($keys, $value) = explode("=", trim($line));
        $akeys = explode(".", $keys);
        $temp = $value;
        for ($i = count($akeys) -  1 ; $i >=  0 ; $i--)
            $temp = array($akeys[$i] => $temp);
        $result = array_merge_recursive($result, $temp);
    }
    return $result;
};

$implementations["mcdb@habr"] = function ($confFile) {
    $content = file($confFile, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
    array_walk($content, function(&$item) {
        $item = sprintf("\$ar['%s'] = '%s';" . PHP_EOL, str_replace('.', "']['", substr($item,  0 , $pos = strpos($item, '='))), substr($item, $pos +  1 ));
    });
    $content = implode(null, $content);
    $fnc = create_function(null, "{$content}; return \$ar;");
    return $fnc ();
};

$implementations["mcdb@habr:2"] = function ($confFile) {
    eval('$f = function () {' . PHP_EOL . implode(null, array_map(function(&$x) {
        return sprintf("\$ar['%s'] = '%s';" . PHP_EOL, str_replace('.', "']['", substr($x,  0 , $o = strpos($x, '='))), substr($x, $o +  1 ));
    }, file($confFile, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES))) . 'return $ar;' . PHP_EOL . "};");
    return $f();
};

$implementations["tzlom@habr"] = function ($filename) {
    $data = file_get_contents($filename);
    $rows = explode("\n", $data);
    $dict = array();
    foreach ($rows as $row) {
        if ($row == '')
            continue;
        list($key, $value) = explode('=', $row,  2 );
        $key = explode('.', $key);
        $addTo = &$dict;
        while (count($key) >  1 ) {
            $addTo = &$addTo[array_shift($key)];
        }
        $addTo[$key[ 0 ]] = $value;
    }
    return $dict;
};

$implementations["nik1550@habr"] = function ($filename) {
    $config = file_get_contents($filename);
    $config_array = explode("\n", $config);
    sort($config_array);
    $result = array();
    foreach ($config_array as $config_item) {
        if ($config_item != NULL) {
            $value = substr($config_item, strpos($config_item, "=") +  1 , strlen($config_item));
            $key = substr($config_item,  0 , strpos($config_item, "="));
            $key_arr = explode(".", $key);
            $tmp = &$result;
            for ($i =  0 ; $i < count($key_arr); $i++) {
                if (!isset($tmp[$key_arr[$i]]))
                    $tmp[$key_arr[$i]] = "";
                $tmp = &$tmp[$key_arr[$i]];
            }
            $tmp = $value;
        }
    }
    return $result;
};

$implementations["BVadim@habr"] = function ($file) {
    $lines = file($file);
    $result = array();
    foreach ($lines as &$line) {
        $line = trim($line);
        if (empty($line))
            continue;
        $lineParts = explode("=", $line);
        $path = explode(".", $lineParts[ 0 ]);
        $current = &$result;
        $pathSize = sizeof($path) -  1 ;
        for ($i =  0 ; $i <= $pathSize; $i++) {
            if ($i == $pathSize) {
                $current[$path[$i]] = $lineParts[ 1 ];
            } else {
                if (!isset($current[$path[$i]]))
                    $current[$path[$i]] = array();
                $current = &$current[$path[$i]];
            }
        }
        unset($current);
    }
    return $result;
};

$implementations["Edd.Dragon"] = function ($file_name) {
    $matches = null;
    if (($size = preg_match_all('/^([^=]+)=(.*)$/m', file_get_contents($file_name), $matches)) === false)
        return array();
    $result = array();
    $var = null;
    for ($i =  0 ; $i < $size; ++$i) {
        eval('$var = &$result[\'' . preg_replace('/\./', '\'][\'', $matches[1][$i]) . '\'];');
        $var = $matches[ 2 ][$i];
    }
    return $result;
};

$implementations["Edd.Dragon:2"] = function ($file_name) {
    $matches = null;
    if (($size = preg_match_all('/^([^=]+)=(.*)$/m', file_get_contents($file_name), $matches)) === false)
        return array();
    $result = array();
    for ($i =  0 ; $i < $size; ++$i) {
        $path = explode('.', $matches[ 1 ][$i]);
        $r = &$result;
        foreach ($path as $key) {
            $r = &$r[$key];
        }
        $r = $matches[ 2 ][$i];
    }
    return $result;
};

foreach ($implementations as $implementator => $implementation) {
    $output = $implementation($input);
    if ($output == $output_right) {
        list($memory_peak_real_before, $memory_peak_before, $memory_real_before, $memory_before)
            = array(memory_get_peak_usage(true), memory_get_peak_usage(), memory_get_usage(true), memory_get_usage());
        $start = microtime(true);
        for ($i =  0 , $n = $argv[ 1 ]; $i < $n; ++$i)
            $output = $implementation($input);
        $end = microtime(true);
        list($memory_peak_real_after, $memory_peak_after, $memory_real_after, $memory_after)
            = array(memory_get_peak_usage(true), memory_get_peak_usage(), memory_get_usage(true), memory_get_usage());

        echo $implementator, "'s implementation returns right result: ",
            $memory_peak_real_after - $memory_peak_real_before, " ",
            $memory_peak_after - $memory_peak_before, " ",
            $memory_real_after - $memory_real_before, " ",
            $memory_after - $memory_before, " ",
            round($end - $start, 2), "\r\n";
    } else
        echo $implementator, "'s implementation does not return right result\r\n";
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196150
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymEdd.Dragon,

меня чуть-чуть обогнал (на самом деле между запусками ты или на несколько сотых быстрее моего или на несколько сотых медленнее; panandy всегда обгоняет и тебя и меня )

То я не тебя обогнал, а код пандани немного подпортил )))
Если бы полностью иной код - другое дело
А так, свежая и смелая идея с эвалом не прошла
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196151
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragon,

у меня код panandy немного поправлен, посмотри в листинге.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196370
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

Ну то мелочь. Основные вопросы6
- как быстрее обработать текст, т.е. получить пары строк;
- как быстрее из этих пар строк создать ассоц. массив.

Ну видимо, тут уже ничего особого не намудришь (при условии, что конфиг корректен и не содержит лишнего, что нужно пропускать).
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196831
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

незнаю актуально или нет))

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 function  read_conf($fn) {
	$a =  array ();
	 foreach ( file ($fn)  as  $v) {
		 list ($keys,$value) =  explode ('=',$v);
		$r=&$a;
		 foreach ( explode ('.',$keys)  as  $k) {
			 if  (! isset ($r[$k]))
				$r[$k]= array ();
			$r=&$r[$k];
		}
		$r = $value;
	}
	 return  $a;
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37197127
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

чуть дольше panandy. Можете сами протестить. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37197193
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymr u,

чуть дольше panandy. Можете сами протестить. :)

вот чуть чуть раскочегарил)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 function  read_conf($fn) {
	$cfg =  array ();
	 foreach ( file ($fn)  as  $line){
		$parts =  explode ('=',$line, 2 );
		 if  (! isset ($parts[ 1 ]))
			 continue ;
		$ref=&$cfg;
		 foreach ( explode ('.', $parts[ 0 ])  as  $key)
				$ref=&$ref[$key];
		$ref = $parts[ 1 ];
	}
	 return  $cfg;
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37197196
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

реализации очень синтетические.
в реальном конфиге вполне могут быть пустые строки, комментарии, некорректные или отсутсвующие значения и т.д.
тоесть надо чтоб функция не умирала на них и не выдавала варнингов и нотисов.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37197209
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

в этом смысле наши реализации вполне подходят (с file(..., FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES)).

Проблемы начнутся только когда будет неоднозначное присвоение:
a.b=c
a.d=e
a=f.
Работать будет, но вот не обязательно, как хотелось бы.

И еще надо внести правки насчет значения по умолчанию в случае
a.b=
или просто
a.b
но это полстрочки кода, которая сильно не замедлит.

Вот если начать исключать невалидные строки (первый пример выше или, например, a..=aaa) - да, скорость сильно ухудшится. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37197212
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т. е. я хотел сказать, что текущие самые быстрые решения полностью рабочие. :) Они умеренно правильно (на мой взгляд) съедят даже ошибочные строки.

А вот если начнутся разговоры типа "Мы в конфиг можем и что-нибудь не то написать [имею в виду не инъекцию для evalа] - надо бы защититься от этого" - то там уже начнутся тормоза и сильное усложнение. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246501
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дана строка:
Код: plaintext
1.
$s = '(((8/2)/2)*((2.7+1.3)+(6/3)-(16/8)+((9/3)+(2*3*(5-4)))))+6+(((16/8)/2)*(10+(3/1)-(4/2)+((8/2)+(7*8*(3-2)))))-3'; //=100
необходимо написать код который вычислит её (те калькулятор)

* Уточнения и ограничения:
- не использовать eval()
- числа в строке: десятичные int или float
- арифметические операции: + - * /
- исходить что входная строка корректна, те содержит только парные скобки и корректную вложенность(валидность входного выражения проверять ненужно)
- проверить правильность вычисления можно в поиске Гугла, там встроенный калькулятор
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246751
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

Код: plaintext
1.
2.
3.
$s = '((( 8 / 2 )/ 2 )*(( 2 . 7 + 1 . 3 )+( 6 / 3 )-( 16 / 8 )+(( 9 / 3 )+( 2 * 3 *( 5 - 4 )))))+ 6 +((( 16 / 8 )/ 2 )*( 10 +( 3 / 1 )-( 4 / 2 )+(( 8 / 2 )+( 7 * 8 *( 3 - 2 )))))- 3 '; //= 100 
$result = file_get_contents('http://www.google.com.ua/#hl=ru&source=hp&biw= 1145 &bih= 685 &q=" . $s);
//тут парсим результат
а вообще пример классический, для тренировки работы со стеком на С
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246774
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artas,

решений много. конечные автоматы, регулярки....

нагрузить для расчетов гугл - не самое лучшее решение)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246797
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В калькуляторе Windows 7 явно не 100 получается :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246837
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettВ калькуляторе Windows 7 явно не 100 получается :)
ну это известная фича)
там калькулятор вычисляет в порядке ввода а не в порядке приоритета операций и скобок, как я понимаю
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246845
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2+2*2 == 6 по крайней мере
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246846
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(2+2)*2 == 8
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246868
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну врет то все же калькулятор винды. В пхп и mysql тоже 100 получается)
...
Рейтинг: 0 / 0
25 сообщений из 271, страница 9 из 11
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Разминка для мозгов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]