наркоманы млять PHP: <?php function ch($num,$str){ foreach($num as $key => $value) $str[$value-1] = strtoupper($str[$value-1]); return $str; } ?> 39: Выведет 0 Я не знаю почему так, но думаю из-за следующего. Все происходит из-за динамического определения типа переменной. ноль вначале свидетельствует что значение переменной - восьмеричное число, но так как после нуля идет 8, чего в восмеричном представлении быть не может, то число превращается в ноль. Еще раз повторю, что я не знаю почему так, но с другими системами счисления не получилось добиться такого результата. в десятично и шестнадцатиричном все время ругается так: А вообще я просто не знаю где об этом можно нормально почитать. Отсюда и все проблемы 40: PHP: <?php $a[1]['a'] = 'lol'; $a[1]['b'] = 'heh'; $a[2]['a'] = 'gygy'; $a[2]['b'] = 'smeh'; $b = array(); $i = 0; foreach($a as $val) foreach($val as $value => $key) $b[$i++] = $key; print_r($b); ?> хотя думаю можно как-нибудь и покороче сделать
Задание 40: PHP: <?php $a[1]['a'] = 'lol'; $a[1]['b'] = 'heh'; $a[2]['a'] = 'gygy'; $a[2]['b'] = 'smeh'; $result = array(); slice_array( $a ); echo '<pre>'; print_r( $result ); function slice_array( $array = array() ) { global $result; foreach( $array as $value ) { if( is_array( $value ) ) slice_array( $value ); else $result[] = $value; } } ?> Эта функция "плющит" любой массив... Ну или если не хотите заморачиваться с глобальными переменными: PHP: function slice_array( $array = array(), &$result ) { foreach( $array as $value ) { if( is_array( $value ) ) slice_array( $value, $result ); else $result[] = $value; } } Первый аргумент - массив который надо плющить, а второй - куда все запишется ( передается указатель на массив, т.е. он должен быть заранее определен ) Задача 39: восьмеричные числа имеют следующее правило: 0[0-7]+ ноль впереди и дальше числа от 0 до 7 ( не выше - на то они и восьмеричные числа ). все что выше == 0 Поэтому эта программа выведет 0. Чтобы вывести 8 нужно написать: 010 По поводу задачи 38 - думаю gisTy норм решение дал...
Задание 38 Code: function ch($num,$str){ foreach($num as $value) if($value<strlen($str)) $str[$value-1] = strtoupper($str[$value-1]); return $str; } во первых там $key в foreach не нужен если на то уже пошло... и небольшой проверки на то что если значение в массиве больше чем букв в строке тоже как бы не мешало
Задание 039 Что выведет скрипт и почему. PHP: <?php $i = 08; echo $i; ?> Выведет 0 потому что,без кавычек считается что это числовое значение.
задание 41 содержимое файла sort.php PHP: if(str_replace('\\', '/', __FILE__) != $_SERVER['SCRIPT_FILENAME']) echo 'included'; else echo 'svoi';
#41 PHP: echo (strpos(__FILE__,$_SERVER['PHP_SELF']) !== false) ? "all right\n" : "include\n"; как-то так
PHP: <?php $i = 08; echo $i; ?> Только начал учить PHP, и понятно что логично было б подумать, что на экран выведит строку "08". Некоторые говорят что только 0, почему, кто пояснит?
задание 42 PHP: $rez = create(5); var_dump($rez); function &create($n) { eval("\$b". str_repeat('[0]', $n) . " = 0;"); return $b; } PHP: function createArr($n) { $a = array(); while(--$n) { $a = array($a); } return $a; }
Новое задание от меня. Определить, что делает скрипт и описать это по шагам (несущих смысловую нагрузку в скрипте буквально 5-7 строк). Скрипт выводит некое число. Откуда оно берется? Почему оно такое? По шагам. Скачать скрипт: http://slil.ru/28081439 http://dump.ru/file/3582271 P.S. Мой обфускатор)
1eval()//выполняет код 2 возвращает оригинальные несжатые данные после gzcompress(); 3 base64_decode()//декодирует данные, закодированные base64_encode();
Я прошу рассказать, что скрыто под всем этим. Скрипт выводит некое число. Откуда оно берется? Почему оно такое? По шагам.
Если запись числа в пхп начинается с цифры 0, значит число записано в восьмеричной системе исчисления, а так как в восьмеричной системе используються цифры от 0 к 7, а цифра 8 не используется, то в результате интерпретатор виводит число 0.
d_x, Назначает переменной $GLOBALS['_B_'] массив из 11 элементов, значение которых - base64_decode. Ф-ция B($i) возвращает декодированный base64 элемент массива $a, индекс которого находится в аргументе ф-ции, в котором находятся дважды кодированные base64 названия ф-ций, заголовков, протокола tcp:// и одной регулярки (мб там еще что-то есть, но я больше не копал). Назначает переменной $GLOBALS['_A_'] массив из 10 элементов Code: [_A_] => Array ( [0] => fsockopen [1] => stream_set_timeout [2] => fputs [3] => fputs [4] => feof [5] => fgets [6] => fclose [7] => preg_match [8] => str_replace [9] => mt_rand ) Ф-ция A возвращает декодированный base64 (название ф-ции берется из $GLOBALS['_B_'][10], а она (как было сказано выше) - base64_decode) элемент массива из массива $__, с индексом - аргументом этой ф-ции. Далее идёт соединение по tcp://www.yandex.ru и выводится ошибка создания сокета (если есть). Потом в цикле while() считывается полученный ответ. Дальше по регулярке Code: /<strong>([,\d]+)<\/strong><\/td><td>.{1,10}<\/td><\/tr><\/tbody><\/table>/Usi находит вхождение (это курс валют). Но ничего не находит, т.к. нету вхождений. Соответственно после проверки на isset() 0.0 (запятая заменена на точку str_replace) умножается на 100, к этому прибавляется... аааа... Вот это подстава И ради банального рандума я сидел более часа над этим кодом? Хех, спасибо, немного пошевелил мозгами Иногда полезно... Респект за задумку...
Отлично, +5 Вот исходный код: PHP: <?php $header="Host: www.yandex.ru\r\n"; $header.="User-Agent: MSIE 7.0 Win\r\n"; $header.="Connection: close\r\n"; $header.="\r\n"; $addquery="GET / HTTP/1.0\r\n"; $host='www.yandex.ru'; $fp=fsockopen("tcp://".$host,80,$errno,$errstr,30); stream_set_timeout($fp,30); if(!$fp) { print "<font color=red>Socket error: <i>$errstr ($errno)</i></font><br>"; die(); } fputs($fp,$addquery); fputs($fp,$header); $ret=''; while(!feof($fp)) { $ret.=fgets($fp, 128); } fclose($fp); preg_match("/<strong>([,\d]+)<\/strong><\/td><td>.{1,10}<\/td><\/tr><\/tbody><\/table>/Usi",$ret,$m); $m=isset($m[1]) ? $m[1] : '0,0'; //получаем курс нефти с яндекс.ру(если не удается, то 0.0) $m=str_replace(',','.',$m); //заменяем запятую на точку $m=(int)$m*100+mt_rand(1,99); //умножаем целую часть курса на 100 и прибавляем рандомное число от 1 до 99 print $m; //выводим ?>
Решение задания 001 <? $str="11111 222222"; preg_match("#(.*) (.*)#is",$str,$m); echo "$m[2] $m[1]"; ?>