|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854 |
- <?php
-
-
- namespace yii\helpers;
-
- use Yii;
- use yii\base\Arrayable;
- use yii\base\InvalidParamException;
-
-
- class BaseArrayHelper
- {
-
-
- public static function toArray($object, $properties = [], $recursive = true)
- {
- if (is_array($object)) {
- if ($recursive) {
- foreach ($object as $key => $value) {
- if (is_array($value) || is_object($value)) {
- $object[$key] = static::toArray($value, $properties, true);
- }
- }
- }
-
- return $object;
- } elseif (is_object($object)) {
- if (!empty($properties)) {
- $className = get_class($object);
- if (!empty($properties[$className])) {
- $result = [];
- foreach ($properties[$className] as $key => $name) {
- if (is_int($key)) {
- $result[$name] = $object->$name;
- } else {
- $result[$key] = static::getValue($object, $name);
- }
- }
-
- return $recursive ? static::toArray($result, $properties) : $result;
- }
- }
- if ($object instanceof Arrayable) {
- $result = $object->toArray([], [], $recursive);
- } else {
- $result = [];
- foreach ($object as $key => $value) {
- $result[$key] = $value;
- }
- }
-
- return $recursive ? static::toArray($result, $properties) : $result;
- } else {
- return [$object];
- }
- }
-
-
-
- public static function merge($a, $b)
- {
- $args = func_get_args();
- $res = array_shift($args);
- while (!empty($args)) {
- $next = array_shift($args);
- foreach ($next as $k => $v) {
- if ($v instanceof UnsetArrayValue) {
- unset($res[$k]);
- } elseif ($v instanceof ReplaceArrayValue) {
- $res[$k] = $v->value;
- } elseif (is_int($k)) {
- if (isset($res[$k])) {
- $res[] = $v;
- } else {
- $res[$k] = $v;
- }
- } elseif (is_array($v) && isset($res[$k]) && is_array($res[$k])) {
- $res[$k] = self::merge($res[$k], $v);
- } else {
- $res[$k] = $v;
- }
- }
- }
-
- return $res;
- }
-
-
-
- public static function getValue($array, $key, $default = null)
- {
- if ($key instanceof \Closure) {
- return $key($array, $default);
- }
-
- if (is_array($key)) {
- $lastKey = array_pop($key);
- foreach ($key as $keyPart) {
- $array = static::getValue($array, $keyPart);
- }
- $key = $lastKey;
- }
-
- if (is_array($array) && (isset($array[$key]) || array_key_exists($key, $array)) ) {
- return $array[$key];
- }
-
- if (($pos = strrpos($key, '.')) !== false) {
- $array = static::getValue($array, substr($key, 0, $pos), $default);
- $key = substr($key, $pos + 1);
- }
-
- if (is_object($array)) {
-
-
- return $array->$key;
- } elseif (is_array($array)) {
- return (isset($array[$key]) || array_key_exists($key, $array)) ? $array[$key] : $default;
- } else {
- return $default;
- }
- }
-
-
-
- public static function remove(&$array, $key, $default = null)
- {
- if (is_array($array) && (isset($array[$key]) || array_key_exists($key, $array))) {
- $value = $array[$key];
- unset($array[$key]);
-
- return $value;
- }
-
- return $default;
- }
-
-
-
- public static function index($array, $key, $groups = [])
- {
- $result = [];
- $groups = (array)$groups;
-
- foreach ($array as $element) {
- $lastArray = &$result;
-
- foreach ($groups as $group) {
- $value = static::getValue($element, $group);
- if (!array_key_exists($value, $lastArray)) {
- $lastArray[$value] = [];
- }
- $lastArray = &$lastArray[$value];
- }
-
- if ($key === null) {
- if (!empty($groups)) {
- $lastArray[] = $element;
- }
- } else {
- $value = static::getValue($element, $key);
- if ($value !== null) {
- if (is_float($value)) {
- $value = (string) $value;
- }
- $lastArray[$value] = $element;
- }
- }
- unset($lastArray);
- }
-
- return $result;
- }
-
-
-
- public static function getColumn($array, $name, $keepKeys = true)
- {
- $result = [];
- if ($keepKeys) {
- foreach ($array as $k => $element) {
- $result[$k] = static::getValue($element, $name);
- }
- } else {
- foreach ($array as $element) {
- $result[] = static::getValue($element, $name);
- }
- }
-
- return $result;
- }
-
-
-
- public static function map($array, $from, $to, $group = null)
- {
- $result = [];
- foreach ($array as $element) {
- $key = static::getValue($element, $from);
- $value = static::getValue($element, $to);
- if ($group !== null) {
- $result[static::getValue($element, $group)][$key] = $value;
- } else {
- $result[$key] = $value;
- }
- }
-
- return $result;
- }
-
-
-
- public static function keyExists($key, $array, $caseSensitive = true)
- {
- if ($caseSensitive) {
-
-
- return isset($array[$key]) || array_key_exists($key, $array);
- } else {
- foreach (array_keys($array) as $k) {
- if (strcasecmp($key, $k) === 0) {
- return true;
- }
- }
-
- return false;
- }
- }
-
-
-
- public static function multisort(&$array, $key, $direction = SORT_ASC, $sortFlag = SORT_REGULAR)
- {
- $keys = is_array($key) ? $key : [$key];
- if (empty($keys) || empty($array)) {
- return;
- }
- $n = count($keys);
- if (is_scalar($direction)) {
- $direction = array_fill(0, $n, $direction);
- } elseif (count($direction) !== $n) {
- throw new InvalidParamException('The length of $direction parameter must be the same as that of $keys.');
- }
- if (is_scalar($sortFlag)) {
- $sortFlag = array_fill(0, $n, $sortFlag);
- } elseif (count($sortFlag) !== $n) {
- throw new InvalidParamException('The length of $sortFlag parameter must be the same as that of $keys.');
- }
- $args = [];
- foreach ($keys as $i => $key) {
- $flag = $sortFlag[$i];
- $args[] = static::getColumn($array, $key);
- $args[] = $direction[$i];
- $args[] = $flag;
- }
-
-
-
- $args[] = range(1, count($array));
- $args[] = SORT_ASC;
- $args[] = SORT_NUMERIC;
-
- $args[] = &$array;
- call_user_func_array('array_multisort', $args);
- }
-
-
-
- public static function htmlEncode($data, $valuesOnly = true, $charset = null)
- {
- if ($charset === null) {
- $charset = Yii::$app ? Yii::$app->charset : 'UTF-8';
- }
- $d = [];
- foreach ($data as $key => $value) {
- if (!$valuesOnly && is_string($key)) {
- $key = htmlspecialchars($key, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
- }
- if (is_string($value)) {
- $d[$key] = htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
- } elseif (is_array($value)) {
- $d[$key] = static::htmlEncode($value, $valuesOnly, $charset);
- } else {
- $d[$key] = $value;
- }
- }
-
- return $d;
- }
-
-
-
- public static function htmlDecode($data, $valuesOnly = true)
- {
- $d = [];
- foreach ($data as $key => $value) {
- if (!$valuesOnly && is_string($key)) {
- $key = htmlspecialchars_decode($key, ENT_QUOTES);
- }
- if (is_string($value)) {
- $d[$key] = htmlspecialchars_decode($value, ENT_QUOTES);
- } elseif (is_array($value)) {
- $d[$key] = static::htmlDecode($value);
- } else {
- $d[$key] = $value;
- }
- }
-
- return $d;
- }
-
-
-
- public static function isAssociative($array, $allStrings = true)
- {
- if (!is_array($array) || empty($array)) {
- return false;
- }
-
- if ($allStrings) {
- foreach ($array as $key => $value) {
- if (!is_string($key)) {
- return false;
- }
- }
- return true;
- } else {
- foreach ($array as $key => $value) {
- if (is_string($key)) {
- return true;
- }
- }
- return false;
- }
- }
-
-
-
- public static function isIndexed($array, $consecutive = false)
- {
- if (!is_array($array)) {
- return false;
- }
-
- if (empty($array)) {
- return true;
- }
-
- if ($consecutive) {
- return array_keys($array) === range(0, count($array) - 1);
- } else {
- foreach ($array as $key => $value) {
- if (!is_int($key)) {
- return false;
- }
- }
- return true;
- }
- }
-
-
-
- public static function isIn($needle, $haystack, $strict = false)
- {
- if ($haystack instanceof \Traversable) {
- foreach ($haystack as $value) {
- if ($needle == $value && (!$strict || $needle === $value)) {
- return true;
- }
- }
- } elseif (is_array($haystack)) {
- return in_array($needle, $haystack, $strict);
- } else {
- throw new InvalidParamException('Argument $haystack must be an array or implement Traversable');
- }
-
- return false;
- }
-
-
-
- public static function isTraversable($var)
- {
- return is_array($var) || $var instanceof \Traversable;
- }
-
-
-
- public static function isSubset($needles, $haystack, $strict = false)
- {
- if (is_array($needles) || $needles instanceof \Traversable) {
- foreach ($needles as $needle) {
- if (!static::isIn($needle, $haystack, $strict)) {
- return false;
- }
- }
- return true;
- } else {
- throw new InvalidParamException('Argument $needles must be an array or implement Traversable');
- }
- }
-
-
-
- public static function filter($array, $filters)
- {
- $result = [];
- $forbiddenVars = [];
-
- foreach ($filters as $var) {
- $keys = explode('.', $var);
- $globalKey = $keys[0];
- $localKey = isset($keys[1]) ? $keys[1] : null;
-
- if ($globalKey[0] === '!') {
- $forbiddenVars[] = [
- substr($globalKey, 1),
- $localKey,
- ];
- continue;
- }
-
- if (empty($array[$globalKey])) {
- continue;
- }
- if ($localKey === null) {
- $result[$globalKey] = $array[$globalKey];
- continue;
- }
- if (!isset($array[$globalKey][$localKey])) {
- continue;
- }
- if (!array_key_exists($globalKey, $result)) {
- $result[$globalKey] = [];
- }
- $result[$globalKey][$localKey] = $array[$globalKey][$localKey];
- }
-
- foreach ($forbiddenVars as $var) {
- list($globalKey, $localKey) = $var;
- if (array_key_exists($globalKey, $result)) {
- unset($result[$globalKey][$localKey]);
- }
- }
-
- return $result;
- }
- }
|