OSDN Git Service

array_shrink_leaves()
[pukiwiki/pukiwiki_sandbox.git] / spam / spam.php
index 90bcf5f..7e3d963 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// $Id: spam.php,v 1.152 2007/05/05 07:28:33 henoheno Exp $
+// $Id: spam.php,v 1.154 2007/05/05 08:49:10 henoheno Exp $
 // Copyright (C) 2006-2007 PukiWiki Developers Team
 // License: GPL v2 or (at your option) any later version
 //
@@ -37,6 +37,26 @@ function preg_grep_invert($pattern = '//', $input = array())
        }
 }
 
+// ----
+
+// Very roughly, shrink the lines of var_export()
+// NOTE: If the same data exists, it must be corrupted.
+function var_export_shrink($expression, $return = FALSE)
+{
+       $result =preg_replace(
+               // Remove a newline and spaces
+               '# => \n *array \(#', ' => array (',
+               var_export($expression, TRUE)
+       );
+
+       if ($return) {
+               return $result;
+       } else {
+               echo   $result;
+               return NULL;
+       }
+}
+
 // Remove redundant values from array()
 function array_unique_recursive($array = array())
 {
@@ -54,7 +74,23 @@ function array_unique_recursive($array = array())
                        }
                }
        }
-       
+
+       return $array;
+}
+
+// Renumber all numeric keys from 0
+function array_renumber_numeric_keys(& $array)
+{
+       if (! is_array($array)) return $array;
+
+       $count = -1;
+       $tmp = array();
+       foreach($array as $key => $value){
+               if (is_array($value)) array_renumber_numeric_keys($array[$key]);        // Recurse
+               if (is_numeric($key)) $tmp[$key] = ++$count;
+       }
+       array_rename_keys($array, $tmp);
+
        return $array;
 }
 
@@ -99,6 +135,16 @@ function strings($binary = '', $min_len = 4, $ignore_space = FALSE)
        return $binary;
 }
 
+// Reverse $string with specified delimiter
+function delimiter_reverse($string = 'foo.bar.example.com', $from_delim = '.', $to_delim = '.')
+{
+       if (! is_string($string) || ! is_string($from_delim) || ! is_string($to_delim))
+               return $string;
+
+       // com.example.bar.foo
+       return implode($to_delim, array_reverse(explode($from_delim, $string)));
+}
+
 
 // ---------------------
 // URI pickup
@@ -1163,13 +1209,19 @@ function check_uri_spam($target = '', $method = array())
                        }
                        if ($asap && $is_spam) break;
 
-                       // Merge $blocked
-                       $blocked = array_merge_leaves($blocked, $_progress['blocked']);
-
-                       // Merge $hosts
-                       $hosts   = array_merge_leaves($hosts,   $_progress['hosts']);
+                       // Merge only
+                       $blocked = array_merge_leaves($blocked, $_progress['blocked'], FALSE, FALSE);
+                       $hosts   = array_merge_leaves($hosts,   $_progress['hosts'],   FALSE, FALSE);
                }
 
+               // Unique values
+               $blocked = array_unique_recursive($blocked);
+               $hosts   = array_unique_recursive($hosts);
+
+               // Renumber numeric keys
+               array_renumber_numeric_keys($blocked);
+               array_renumber_numeric_keys($hosts);
+
                // Recount $sum['badhost']
                $sum['badhost'] = array_count_leaves($blocked);
 
@@ -1321,14 +1373,40 @@ function array_count_leaves($array = array(), $count_empty = FALSE)
 }
 
 // Merge two leaves' value
-function array_merge_leaves(& $array1, & $array2, $unique_values = TRUE)
+function array_merge_leaves(& $array1, & $array2, $unique_values = TRUE, $renumber_numeric = TRUE)
 {
-       // All NUMERIC keys are always renumbered from 0
        $array = array_merge_recursive($array1, $array2);
 
        // Redundant values (and keys) are vanished
        if ($unique_values) $array = array_unique_recursive($array);
 
+       // All NUMERIC keys are always renumbered from 0
+       if ($renumber_numeric) array_renumber_numeric_keys($array);
+
+       return $array;
+}
+
+// Shrink array('key' => array('key')) to array('key')
+function array_shrink_leaves(& $array)
+{
+       if (! is_array($array)) return $array;
+
+       foreach($array as $key => $value){
+               // Recurse. Removing more leaves beforehand
+               if (is_array($value)) array_shrink_leaves($array[$key]);
+       }
+
+       $tmp = array();
+       foreach($array as $key => $value){
+               if (is_array($value)) {
+                       $count = count($value);
+                       if ($count == 1 && current($value) == $key) {
+                               unset($array[$key]);
+                               $array[] = $key;
+                       }
+               }
+       }
+
        return $array;
 }
 
@@ -1357,39 +1435,11 @@ function summarize_spam_progress($progress = array(), $blockedonly = FALSE)
        return implode(', ', $tmp);
 }
 
-// Very roughly, shrink the lines of var_export()
-// NOTE: If the same data exists, it must be corrupted.
-function var_export_shrink($expression, $return = FALSE)
-{
-       $result =preg_replace(
-               // Remove a newline and spaces
-               '# => \n *array \(#', ' => array (',
-               var_export($expression, TRUE)
-       );
-
-       if ($return) {
-               return $result;
-       } else {
-               echo   $result;
-               return NULL;
-       }
-}
-
 function summarize_detail_badhost($progress = array())
 {
        if (! isset($progress['is_spam']['badhost'])) return '';
 
-       return var_export_shrink($progress['blocked'], TRUE);
-}
-
-// Reverse $string with specified delimiter
-function delimiter_reverse($string = 'foo.bar.example.com', $from_delim = '.', $to_delim = '.')
-{
-       if (! is_string($string) || ! is_string($from_delim) || ! is_string($to_delim))
-               return $string;
-
-       // com.example.bar.foo
-       return implode($to_delim, array_reverse(explode($from_delim, $string)));
+       return var_export_shrink(array_shrink_leaves($progress['blocked']), TRUE);
 }
 
 function summarize_detail_newtral($progress = array())