Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: My_print_r
 
 автор: Евгений Петров   (17.05.2007 в 16:10)   письмо автору
 
 

Привет всем. Сижу ломаю голову как это сделать. Надо написать аналог print_r. Причем он не должен зависать на:

<?
    $a 
= array("some", &$a);
    
    function 
my_print_r($a)
    {
        
// ?
    
}
?>

   
 
 автор: mefestofel   (17.05.2007 в 16:53)   письмо автору
 
   для: Евгений Петров   (17.05.2007 в 16:10)
 

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

   
 
 автор: Евгений Петров   (17.05.2007 в 17:06)   письмо автору
 
   для: mefestofel   (17.05.2007 в 16:53)
 

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

   
 
 автор: Trianon   (17.05.2007 в 17:41)   письмо автору
 
   для: Евгений Петров   (17.05.2007 в 17:06)
 

нужно взаиморекурсивно применять array_map .
весь вывод вести снаружи.
Тема из раздела PHP

   
 
 автор: Евгений Петров   (17.05.2007 в 18:11)   письмо автору
 
   для: Trianon   (17.05.2007 в 17:41)
 

и что нам это даст?

   
 
 автор: kasmanaft   (17.05.2007 в 23:21)   письмо автору
 
   для: Евгений Петров   (17.05.2007 в 16:10)
 

По-моему, точно выловить такую рекурсию не получится.... может быть мне нужен такой массив, с виду похожий на зацикленный?! А как определить зацикленный он или нет...
Хорошо бы посмотреть адрес "подозрительного" элемента и сравнивать адреса, а не сами элементы.. адрес одинаковый - все ясно.. а так: значения одинаковые, ну и что? они должны быть одинаковые! мне нужен n-мерный массив с одинаковыми элементами.. (хз зачем, но надо :) ). Остается только гадать..

Научил функцию выводить 5-ти мерные массивы.. а если надо больше - можно использовать второй аргумент. Вот, что получилось:

<pre>
<?php
$a 
= array("some", &$a);
function 
my_print_r($a$maxlevel 0$level 0)
{
    if (
gettype($a) == "array")
    {
        
$str str_repeat(' '$level*4);
        echo 
"Array\r\n"$str"(\r\n";
        foreach(
$a as $key => $val)
        {
            if (
gettype($val) != "array")
                echo 
$str"    [$key] => "$val"\r\n";
            else
            {
                echo 
$str"    [$key] => ";
                if ((
$maxlevel && $level == $maxlevel) || ($maxlevel == && $level 4))
                    echo 
"*RECURSION*\r\n";
                else 
my_print_r($val$maxlevel, ++$level);
            }
        }
        echo 
$str")\r\n\r\n";
    }
}
my_print_r($a);
?>

   
 
 автор: Евгений Петров   (18.05.2007 в 01:57)   письмо автору
 
   для: kasmanaft   (17.05.2007 в 23:21)
 

Не, надо на неогр.. Впринципе на скорую руку набросал немного. Вот что получилось:
<?
    $a 
null;
    
$a = array
    (
        
=> "first",
        
=> "second",
        
=> array
        (
            
=> array(12, array("key" => "value")),
            
=> &$a,
            
=> null,
            
=> array
            (
                array
                (
                    array(&
$a)
                )
            ),
        ),
        
=> array(truefalsenull)
    );

    function 
_my_print_r(&$var$level 0)
    {
        static 
$printed null;

        if(
is_null($printed)) {
            
$printed md5(microtime().rand(10000009999999).uniqid());
        }

        
$space "    ";
        
$str "";

        if(
is_array($var))
        {
            if(!isset(
$var[$printed]))
            {
                
$var[$printed] = true;
                
$str.= "Array\n".str_repeat($space$level)."(\n";
                
reset($var);
                
$n count($var) - 1;
                while(
$n--)
                {
                    
$key key($var);
                    
$str.= str_repeat($space$level 1)."[".$key."] => "._my_print_r(&$var[$key], $level 2)."\n";
                    
next($var);
                }
                
$str.= str_repeat($space$level).")";
                unset(
$var[$printed]);
            }
            else
            {
                
$str.= "*RECURSION*";
            }
        }
        else
        {
            
$str.= print_var($var);
        }

        return 
$str;
    }

    function 
print_var($var)
    {
        if(
is_null($var)) {
            return 
"<i>NULL</i>";
        } else if(
$var === false) {
            return 
"<i>FALSE</i>";
        } else if(
$var ===true) {
            return 
"<i>TRUE</i>";
        } else {
            return 
$var;
        }
    }

    function 
my_print_r(&$var$return false)
    {
        
$str _my_print_r(&$var);

        if(
$return == true) {
            return 
$str;
        } else {
            echo 
$str;
        }
    }

    echo 
"<pre>";
    
my_print_r($a);
    echo 
"</pre>";
?>

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования