|
|
|
| Привет всем. Сижу ломаю голову как это сделать. Надо написать аналог print_r. Причем он не должен зависать на:
<?
$a = array("some", &$a);
function my_print_r($a)
{
// ?
}
?>
|
| |
|
|
|
|
|
|
|
для: Евгений Петров
(17.05.2007 в 16:10)
| | используй проверку на вложенные массивы, перебирай элементы массива в цикле и выводи функцией print(). | |
|
|
|
|
|
|
|
для: mefestofel
(17.05.2007 в 16:53)
| | Это не проблемма, проблемма в том что элементом массива может быть ссылка на уже пройденный массив, надо как то отслеживать зацикливание.. | |
|
|
|
|
|
|
|
для: Евгений Петров
(17.05.2007 в 17:06)
| | нужно взаиморекурсивно применять array_map .
весь вывод вести снаружи.
Тема из раздела PHP | |
|
|
|
|
|
|
|
для: Trianon
(17.05.2007 в 17:41)
| | и что нам это даст? | |
|
|
|
|
|
|
|
для: Евгений Петров
(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 > 0 && $level == $maxlevel) || ($maxlevel == 0 && $level > 4))
echo "*RECURSION*\r\n";
else my_print_r($val, $maxlevel, ++$level);
}
}
echo $str, ")\r\n\r\n";
}
}
my_print_r($a);
?>
|
| |
|
|
|
|
|
|
|
для: kasmanaft
(17.05.2007 в 23:21)
| | Не, надо на неогр.. Впринципе на скорую руку набросал немного. Вот что получилось:
<?
$a = null;
$a = array
(
0 => "first",
1 => "second",
2 => array
(
0 => array(1, 2, array("key" => "value")),
1 => &$a,
2 => null,
3 => array
(
array
(
array(&$a)
)
),
),
3 => array(true, false, null)
);
function _my_print_r(&$var, $level = 0)
{
static $printed = null;
if(is_null($printed)) {
$printed = md5(microtime().rand(1000000, 9999999).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>";
?>
|
| |
|
|
|