Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

ArrayUtils.php

Zuletzt modifiziert: 09.10.2024, 12:55 - Dateigröße: 9.31 KiB


 001  <?php
 002  /**
 003   * Zend Framework (http://framework.zend.com/)
 004   *
 005   * @link      http://github.com/zendframework/zf2 for the canonical source repository
 006   * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
 007   * @license   http://framework.zend.com/license/new-bsd New BSD License
 008   */
 009   
 010  namespace Zend\Stdlib;
 011   
 012  use Traversable;
 013  use Zend\Stdlib\ArrayUtils\MergeRemoveKey;
 014  use Zend\Stdlib\ArrayUtils\MergeReplaceKeyInterface;
 015   
 016  /**
 017   * Utility class for testing and manipulation of PHP arrays.
 018   *
 019   * Declared abstract, as we have no need for instantiation.
 020   */
 021  abstract class ArrayUtils
 022  {
 023      /**
 024       * Compatibility Flag for ArrayUtils::filter
 025       */
 026      const ARRAY_FILTER_USE_BOTH = 1;
 027   
 028      /**
 029       * Compatibility Flag for ArrayUtils::filter
 030       */
 031      const ARRAY_FILTER_USE_KEY  = 2;
 032   
 033      /**
 034       * Test whether an array contains one or more string keys
 035       *
 036       * @param  mixed $value
 037       * @param  bool  $allowEmpty    Should an empty array() return true
 038       * @return bool
 039       */
 040      public static function hasStringKeys($value, $allowEmpty = false)
 041      {
 042          if (!is_array($value)) {
 043              return false;
 044          }
 045   
 046          if (!$value) {
 047              return $allowEmpty;
 048          }
 049   
 050          return count(array_filter(array_keys($value), 'is_string')) > 0;
 051      }
 052   
 053      /**
 054       * Test whether an array contains one or more integer keys
 055       *
 056       * @param  mixed $value
 057       * @param  bool  $allowEmpty    Should an empty array() return true
 058       * @return bool
 059       */
 060      public static function hasIntegerKeys($value, $allowEmpty = false)
 061      {
 062          if (!is_array($value)) {
 063              return false;
 064          }
 065   
 066          if (!$value) {
 067              return $allowEmpty;
 068          }
 069   
 070          return count(array_filter(array_keys($value), 'is_int')) > 0;
 071      }
 072   
 073      /**
 074       * Test whether an array contains one or more numeric keys.
 075       *
 076       * A numeric key can be one of the following:
 077       * - an integer 1,
 078       * - a string with a number '20'
 079       * - a string with negative number: '-1000'
 080       * - a float: 2.2120, -78.150999
 081       * - a string with float:  '4000.99999', '-10.10'
 082       *
 083       * @param  mixed $value
 084       * @param  bool  $allowEmpty    Should an empty array() return true
 085       * @return bool
 086       */
 087      public static function hasNumericKeys($value, $allowEmpty = false)
 088      {
 089          if (!is_array($value)) {
 090              return false;
 091          }
 092   
 093          if (!$value) {
 094              return $allowEmpty;
 095          }
 096   
 097          return count(array_filter(array_keys($value), 'is_numeric')) > 0;
 098      }
 099   
 100      /**
 101       * Test whether an array is a list
 102       *
 103       * A list is a collection of values assigned to continuous integer keys
 104       * starting at 0 and ending at count() - 1.
 105       *
 106       * For example:
 107       * <code>
 108       * $list = array('a', 'b', 'c', 'd');
 109       * $list = array(
 110       *     0 => 'foo',
 111       *     1 => 'bar',
 112       *     2 => array('foo' => 'baz'),
 113       * );
 114       * </code>
 115       *
 116       * @param  mixed $value
 117       * @param  bool  $allowEmpty    Is an empty list a valid list?
 118       * @return bool
 119       */
 120      public static function isList($value, $allowEmpty = false)
 121      {
 122          if (!is_array($value)) {
 123              return false;
 124          }
 125   
 126          if (!$value) {
 127              return $allowEmpty;
 128          }
 129   
 130          return (array_values($value) === $value);
 131      }
 132   
 133      /**
 134       * Test whether an array is a hash table.
 135       *
 136       * An array is a hash table if:
 137       *
 138       * 1. Contains one or more non-integer keys, or
 139       * 2. Integer keys are non-continuous or misaligned (not starting with 0)
 140       *
 141       * For example:
 142       * <code>
 143       * $hash = array(
 144       *     'foo' => 15,
 145       *     'bar' => false,
 146       * );
 147       * $hash = array(
 148       *     1995  => 'Birth of PHP',
 149       *     2009  => 'PHP 5.3.0',
 150       *     2012  => 'PHP 5.4.0',
 151       * );
 152       * $hash = array(
 153       *     'formElement,
 154       *     'options' => array( 'debug' => true ),
 155       * );
 156       * </code>
 157       *
 158       * @param  mixed $value
 159       * @param  bool  $allowEmpty    Is an empty array() a valid hash table?
 160       * @return bool
 161       */
 162      public static function isHashTable($value, $allowEmpty = false)
 163      {
 164          if (!is_array($value)) {
 165              return false;
 166          }
 167   
 168          if (!$value) {
 169              return $allowEmpty;
 170          }
 171   
 172          return (array_values($value) !== $value);
 173      }
 174   
 175      /**
 176       * Checks if a value exists in an array.
 177       *
 178       * Due to "foo" == 0 === TRUE with in_array when strict = false, an option
 179       * has been added to prevent this. When $strict = 0/false, the most secure
 180       * non-strict check is implemented. if $strict = -1, the default in_array
 181       * non-strict behaviour is used.
 182       *
 183       * @param mixed $needle
 184       * @param array $haystack
 185       * @param int|bool $strict
 186       * @return bool
 187       */
 188      public static function inArray($needle, array $haystack, $strict = false)
 189      {
 190          if (!$strict) {
 191              if (is_int($needle) || is_float($needle)) {
 192                  $needle = (string) $needle;
 193              }
 194              if (is_string($needle)) {
 195                  foreach ($haystack as &$h) {
 196                      if (is_int($h) || is_float($h)) {
 197                          $h = (string) $h;
 198                      }
 199                  }
 200              }
 201          }
 202          return in_array($needle, $haystack, $strict);
 203      }
 204   
 205      /**
 206       * Convert an iterator to an array.
 207       *
 208       * Converts an iterator to an array. The $recursive flag, on by default,
 209       * hints whether or not you want to do so recursively.
 210       *
 211       * @param  array|Traversable  $iterator     The array or Traversable object to convert
 212       * @param  bool               $recursive    Recursively check all nested structures
 213       * @throws Exception\InvalidArgumentException if $iterator is not an array or a Traversable object
 214       * @return array
 215       */
 216      public static function iteratorToArray($iterator, $recursive = true)
 217      {
 218          if (!is_array($iterator) && !$iterator instanceof Traversable) {
 219              throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable object');
 220          }
 221   
 222          if (!$recursive) {
 223              if (is_array($iterator)) {
 224                  return $iterator;
 225              }
 226   
 227              return iterator_to_array($iterator);
 228          }
 229   
 230          if (method_exists($iterator, 'toArray')) {
 231              return $iterator->toArray();
 232          }
 233   
 234          $array = array();
 235          foreach ($iterator as $key => $value) {
 236              if (is_scalar($value)) {
 237                  $array[$key] = $value;
 238                  continue;
 239              }
 240   
 241              if ($value instanceof Traversable) {
 242                  $array[$key] = static::iteratorToArray($value, $recursive);
 243                  continue;
 244              }
 245   
 246              if (is_array($value)) {
 247                  $array[$key] = static::iteratorToArray($value, $recursive);
 248                  continue;
 249              }
 250   
 251              $array[$key] = $value;
 252          }
 253   
 254          return $array;
 255      }
 256   
 257      /**
 258       * Merge two arrays together.
 259       *
 260       * If an integer key exists in both arrays and preserveNumericKeys is false, the value
 261       * from the second array will be appended to the first array. If both values are arrays, they
 262       * are merged together, else the value of the second array overwrites the one of the first array.
 263       *
 264       * @param  array $a
 265       * @param  array $b
 266       * @param  bool  $preserveNumericKeys
 267       * @return array
 268       */
 269      public static function merge(array $a, array $b, $preserveNumericKeys = false)
 270      {
 271          foreach ($b as $key => $value) {
 272              if ($value instanceof MergeReplaceKeyInterface) {
 273                  $a[$key] = $value->getData();
 274              } elseif (isset($a[$key]) || array_key_exists($key, $a)) {
 275                  if ($value instanceof MergeRemoveKey) {
 276                      unset($a[$key]);
 277                  } elseif (!$preserveNumericKeys && is_int($key)) {
 278                      $a[] = $value;
 279                  } elseif (is_array($value) && is_array($a[$key])) {
 280                      $a[$key] = static::merge($a[$key], $value, $preserveNumericKeys);
 281                  } else {
 282                      $a[$key] = $value;
 283                  }
 284              } else {
 285                  if (!$value instanceof MergeRemoveKey) {
 286                      $a[$key] = $value;
 287                  }
 288              }
 289          }
 290   
 291          return $a;
 292      }
 293   
 294      /**
 295       * Compatibility Method for array_filter on <5.6 systems
 296       *
 297       * @param array $data
 298       * @param callable $callback
 299       * @param null|int $flag
 300       * @return array
 301       */
 302      public static function filter(array $data, $callback, $flag = null)
 303      {
 304          if (! is_callable($callback)) {
 305              throw new Exception\InvalidArgumentException(sprintf(
 306                  'Second parameter of %s must be callable',
 307                  __METHOD__
 308              ));
 309          }
 310   
 311          if (version_compare(PHP_VERSION, '5.6.0') >= 0) {
 312              return array_filter($data, $callback, $flag);
 313          }
 314   
 315          $output = array();
 316          foreach ($data as $key => $value) {
 317              $params = array($value);
 318   
 319              if ($flag === static::ARRAY_FILTER_USE_BOTH) {
 320                  $params[] = $key;
 321              }
 322   
 323              if ($flag === static::ARRAY_FILTER_USE_KEY) {
 324                  $params = array($key);
 325              }
 326   
 327              $response = call_user_func_array($callback, $params);
 328              if ($response) {
 329                  $output[$key] = $value;
 330              }
 331          }
 332   
 333          return $output;
 334      }
 335  }
 336