0 关注者

类 yii\helpers\BaseArrayHelper

继承yii\helpers\BaseArrayHelper
子类yii\helpers\ArrayHelper
可用版本2.0
源代码 https://github.com/yiisoft/yii2/blob/master/framework/helpers/BaseArrayHelper.php

BaseArrayHelper 为 yii\helpers\ArrayHelper 提供具体的实现。

不要使用 BaseArrayHelper。请使用 yii\helpers\ArrayHelper 替代。

公共方法

隐藏继承的方法

方法 描述 定义位置
filter() 根据指定的规则过滤数组。 yii\helpers\BaseArrayHelper
getColumn() 返回数组中指定列的值。 yii\helpers\BaseArrayHelper
getValue() 检索数组元素或对象属性的值,使用给定的键或属性名称。 yii\helpers\BaseArrayHelper
htmlDecode() 将字符串数组中的 HTML 实体解码为相应的字符。 yii\helpers\BaseArrayHelper
htmlEncode() 将字符串数组中的特殊字符编码为 HTML 实体。 yii\helpers\BaseArrayHelper
index() 根据指定的键对数组进行索引和/或分组。 yii\helpers\BaseArrayHelper
isAssociative() 返回一个值,指示给定的数组是否为关联数组。 yii\helpers\BaseArrayHelper
isIn() 检查数组或 可遍历对象 是否包含元素。 yii\helpers\BaseArrayHelper
isIndexed() 返回一个值,指示给定的数组是否为索引数组。 yii\helpers\BaseArrayHelper
isSubset() 检查数组或 可遍历对象 是否为另一个数组或 可遍历对象 的子集。 yii\helpers\BaseArrayHelper
isTraversable() 检查变量是否为数组或 可遍历对象 yii\helpers\BaseArrayHelper
keyExists() 检查给定数组是否包含指定的键。 yii\helpers\BaseArrayHelper
map() 从多维数组或对象数组构建映射(键值对)。 yii\helpers\BaseArrayHelper
merge() 将两个或多个数组递归地合并为一个。 yii\helpers\BaseArrayHelper
multisort() 根据一个或多个键对对象或数组(具有相同结构)的数组进行排序。 yii\helpers\BaseArrayHelper
recursiveSort() 递归地排序数组。 yii\helpers\BaseArrayHelper
remove() 从数组中删除一项并返回该值。如果数组中不存在该键,则将返回默认值。 yii\helpers\BaseArrayHelper
removeValue() 从数组中删除具有匹配值的项,并返回已删除的项。 yii\helpers\BaseArrayHelper
setValue() 在指定的键路径处将值写入关联数组。 yii\helpers\BaseArrayHelper
toArray() 将对象或对象数组转换为数组。 yii\helpers\BaseArrayHelper

方法详情

隐藏继承的方法

filter() public static method (available since version 2.0.9)

根据指定的规则过滤数组。

例如

$array = [
    'A' => [1, 2],
    'B' => [
        'C' => 1,
        'D' => 2,
    ],
    'E' => 1,
];

$result = \yii\helpers\ArrayHelper::filter($array, ['A']);
// $result will be:
// [
//     'A' => [1, 2],
// ]

$result = \yii\helpers\ArrayHelper::filter($array, ['A', 'B.C']);
// $result will be:
// [
//     'A' => [1, 2],
//     'B' => ['C' => 1],
// ]

$result = \yii\helpers\ArrayHelper::filter($array, ['B', '!B.C']);
// $result will be:
// [
//     'B' => ['D' => 2],
// ]
public static array filter ( $array, $filters )
$array array

源数组

$filters 可迭代对象

定义应保留或从结果中删除的数组键的规则。每个规则都是

  • var - $array['var'] 将保留在结果中。
  • var.key = 只有 $array['var']['key'] 将保留在结果中。
  • !var.key = $array['var']['key'] 将从结果中删除。
返回值 array

已过滤的数组

                public static function filter($array, $filters)
{
    $result = [];
    $excludeFilters = [];
    foreach ($filters as $filter) {
        if (!is_string($filter) && !is_int($filter)) {
            continue;
        }
        if (is_string($filter) && strncmp($filter, '!', 1) === 0) {
            $excludeFilters[] = substr($filter, 1);
            continue;
        }
        $nodeValue = $array; //set $array as root node
        $keys = explode('.', (string) $filter);
        foreach ($keys as $key) {
            if (!array_key_exists($key, $nodeValue)) {
                continue 2; //Jump to next filter
            }
            $nodeValue = $nodeValue[$key];
        }
        //We've found a value now let's insert it
        $resultNode = &$result;
        foreach ($keys as $key) {
            if (!array_key_exists($key, $resultNode)) {
                $resultNode[$key] = [];
            }
            $resultNode = &$resultNode[$key];
        }
        $resultNode = $nodeValue;
    }
    foreach ($excludeFilters as $filter) {
        $excludeNode = &$result;
        $keys = explode('.', (string) $filter);
        $numNestedKeys = count($keys) - 1;
        foreach ($keys as $i => $key) {
            if (!array_key_exists($key, $excludeNode)) {
                continue 2; //Jump to next filter
            }
            if ($i < $numNestedKeys) {
                $excludeNode = &$excludeNode[$key];
            } else {
                unset($excludeNode[$key]);
                break;
            }
        }
    }
    return $result;
}

            
getColumn() public static method

返回数组中指定列的值。

输入数组应为多维数组或对象数组。

例如,

$array = [
    ['id' => '123', 'data' => 'abc'],
    ['id' => '345', 'data' => 'def'],
];
$result = ArrayHelper::getColumn($array, 'id');
// the result is: ['123', '345']

// using anonymous function
$result = ArrayHelper::getColumn($array, function ($element) {
    return $element['id'];
});
public static array getColumn ( $array, $name, $keepKeys true )
$array array
$name integer|string|array|Closure
$keepKeys boolean

是否保留数组键。如果为 false,则结果数组将使用整数重新索引。

返回值 array

列值的列表

                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;
}

            
getValue() public static method

检索数组元素或对象属性的值,使用给定的键或属性名称。

如果数组中不存在该键,则将返回默认值。在从对象获取值时不会使用。

该键可以用点格式指定,以检索子数组的值或嵌入对象的属性。特别是,如果键是 x.y.z,则返回值将是 $array['x']['y']['z']$array->x->y->z(如果 $array 是一个对象)。如果 $array['x']$array->x 既不是数组也不是对象,则将返回默认值。请注意,如果数组中已经有一个元素 x.y.z,那么将返回它的值,而不是遍历子数组。因此,最好通过指定键名称的数组来完成,例如 ['x', 'y', 'z']

以下是一些使用示例,

// working with array
$username = \yii\helpers\ArrayHelper::getValue($_POST, 'username');
// working with object
$username = \yii\helpers\ArrayHelper::getValue($user, 'username');
// working with anonymous function
$fullName = \yii\helpers\ArrayHelper::getValue($user, function ($user, $defaultValue) {
    return $user->firstName . ' ' . $user->lastName;
});
// using dot format to retrieve the property of embedded object
$street = \yii\helpers\ArrayHelper::getValue($users, 'address.street');
// using an array of keys to retrieve the value
$value = \yii\helpers\ArrayHelper::getValue($versions, ['1.0', 'date']);
public static mixed getValue ( $array, $key, $default null )
$array array|object

要从中提取值的数组或对象

$key string|Closure|array

数组元素的键名,键的数组或对象的属性名,或返回值的匿名函数。匿名函数签名应为:function($array, $defaultValue)。从 2.0.4 版本开始提供传递键数组的可能性。

$default 混合

如果指定的数组键不存在,则返回的默认值。从对象获取值时不使用。

返回值 混合

如果找到元素的值,否则为默认值

                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_object($array) && property_exists($array, $key)) {
        return $array->$key;
    }
    if (static::keyExists($key, $array)) {
        return $array[$key];
    }
    if ($key && ($pos = strrpos($key, '.')) !== false) {
        $array = static::getValue($array, substr($key, 0, $pos), $default);
        $key = substr($key, $pos + 1);
    }
    if (static::keyExists($key, $array)) {
        return $array[$key];
    }
    if (is_object($array)) {
        // this is expected to fail if the property does not exist, or __get() is not implemented
        // it is not reliably possible to check whether a property is accessible beforehand
        try {
            return $array->$key;
        } catch (\Exception $e) {
            if ($array instanceof ArrayAccess) {
                return $default;
            }
            throw $e;
        }
    }
    return $default;
}

            
htmlDecode() 公共静态方法

将字符串数组中的 HTML 实体解码为相应的字符。

默认情况下,只有数组值将被解码。如果一个值是一个数组,此方法也会递归地解码它。只有字符串值会被解码。

另请参见 https://php.ac.cn/manual/en/function.htmlspecialchars-decode.php.

public static array htmlDecode ( $data, $valuesOnly true )
$data array

要解码的数据

$valuesOnly boolean

是否只解码数组值。如果为 false,则数组键和数组值都将被解码。

返回值 array

解码后的数据

                public static function htmlDecode($data, $valuesOnly = true)
{
    $d = [];
    foreach ($data as $key => $value) {
        if (!$valuesOnly && is_string($key)) {
            $key = htmlspecialchars_decode($key, ENT_QUOTES | ENT_SUBSTITUTE);
        }
        if (is_string($value)) {
            $d[$key] = htmlspecialchars_decode($value, ENT_QUOTES | ENT_SUBSTITUTE);
        } elseif (is_array($value)) {
            $d[$key] = static::htmlDecode($value, $valuesOnly);
        } else {
            $d[$key] = $value;
        }
    }
    return $d;
}

            
htmlEncode() 公共静态方法

将字符串数组中的特殊字符编码为 HTML 实体。

默认情况下,只有数组值将被编码。如果一个值是一个数组,此方法也会递归地编码它。只有字符串值会被编码。

另请参见 https://php.ac.cn/manual/en/function.htmlspecialchars.php.

public static array htmlEncode ( $data, $valuesOnly true, $charset null )
$data array

要编码的数据

$valuesOnly boolean

是否只编码数组值。如果为 false,则数组键和数组值都将被编码。

$charset string|null

数据使用的字符集。如果没有设置,将使用 yii\base\Application::$charset

返回值 array

编码后的数据

                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;
}

            
index() 公共静态方法

根据指定的键对数组进行索引和/或分组。

输入应该是多维数组或对象数组。

$key 可以是子数组的键名,对象的属性名,或返回将用作键的值的匿名函数。

$groups 是一个键的数组,它将用于根据指定的键将输入数组分组为一个或多个子数组。

如果 $key 指定为 null,或者对应于键的元素的值为 null$groups 未指定,则该元素将被丢弃。

例如

$array = [
    ['id' => '123', 'data' => 'abc', 'device' => 'laptop'],
    ['id' => '345', 'data' => 'def', 'device' => 'tablet'],
    ['id' => '345', 'data' => 'hgi', 'device' => 'smartphone'],
];
$result = ArrayHelper::index($array, 'id');

结果将是一个关联数组,其中键是 id 属性的值

[
    '123' => ['id' => '123', 'data' => 'abc', 'device' => 'laptop'],
    '345' => ['id' => '345', 'data' => 'hgi', 'device' => 'smartphone']
    // The second element of an original array is overwritten by the last element because of the same id
]

匿名函数也可以在分组数组中使用。

$result = ArrayHelper::index($array, function ($element) {
    return $element['id'];
});

传递 id 作为第三个参数将按 id$array 进行分组

$result = ArrayHelper::index($array, null, 'id');

结果将是一个多维数组,第一级按 id 分组,第二级按 device 分组,第三级按 data 索引

[
    '123' => [
        ['id' => '123', 'data' => 'abc', 'device' => 'laptop']
    ],
    '345' => [ // all elements with this index are present in the result array
        ['id' => '345', 'data' => 'def', 'device' => 'tablet'],
        ['id' => '345', 'data' => 'hgi', 'device' => 'smartphone'],
    ]
]

匿名函数也可以在分组键数组中使用

$result = ArrayHelper::index($array, 'data', [function ($element) {
    return $element['id'];
}, 'device']);

结果将是一个多维数组,第一级按 id 分组,第二级按 device 分组,第三级按 data 索引

[
    '123' => [
        'laptop' => [
            'abc' => ['id' => '123', 'data' => 'abc', 'device' => 'laptop']
        ]
    ],
    '345' => [
        'tablet' => [
            'def' => ['id' => '345', 'data' => 'def', 'device' => 'tablet']
        ],
        'smartphone' => [
            'hgi' => ['id' => '345', 'data' => 'hgi', 'device' => 'smartphone']
        ]
    ]
]
public static array index ( $array, $key, $groups = [] )
$array array

需要索引或分组的数组

$key string|Closure|null

列名或匿名函数,其结果将用于索引数组

$groups string|string[]|Closure[]|null

将用于按一个或多个键对输入数组进行分组的键数组。如果 $key 属性或其对应于特定元素的值为 null 且 $groups 未定义,则该数组元素将被丢弃。否则,如果指定了 $groups,则数组元素将被添加到结果数组中,没有任何键。此参数从版本 2.0.8 开始可用。

返回值 array

已索引和/或分组的数组

                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 = StringHelper::floatToString($value);
                }
                $lastArray[$value] = $element;
            }
        }
        unset($lastArray);
    }
    return $result;
}

            
isAssociative() 公共静态方法

返回一个值,指示给定的数组是否为关联数组。

如果所有键都是字符串,则数组为关联数组。如果 $allStrings 为 false,则如果数组的至少一个键为字符串,则该数组将被视为关联数组。

请注意,空数组将不被视为关联数组。

public static boolean isAssociative ( $array, $allStrings true )
$array array

正在检查的数组

$allStrings boolean

为了将数组视为关联数组,数组键是否必须全部为字符串。

返回值 boolean

数组是否为关联数组

                public static function isAssociative($array, $allStrings = true)
{
    if (empty($array) || !is_array($array)) {
        return false;
    }
    if ($allStrings) {
        foreach ($array as $key => $value) {
            if (!is_string($key)) {
                return false;
            }
        }
        return true;
    }
    foreach ($array as $key => $value) {
        if (is_string($key)) {
            return true;
        }
    }
    return false;
}

            
isIn() 公共静态方法 (从版本 2.0.7 开始可用)

检查数组或 可遍历对象 是否包含元素。

此方法与 PHP 函数 in_array() 的功能相同,但此外还适用于实现了 Traversable 接口的对象。

另请参见 https://php.ac.cn/manual/en/function.in-array.php.

public static boolean isIn ( $needle, $haystack, $strict false )
$needle 混合

要查找的值。

$haystack 可迭代对象

要搜索的值集。

$strict boolean

是否启用严格 (===) 比较。

返回值 boolean

如果在 $haystack 中找到 $needle,则为 true,否则为 false

抛出 yii\base\InvalidArgumentException

如果 $haystack 既不可遍历也不为数组。

                public static function isIn($needle, $haystack, $strict = false)
{
    if (!static::isTraversable($haystack)) {
        throw new InvalidArgumentException('Argument $haystack must be an array or implement Traversable');
    }
    if (is_array($haystack)) {
        return in_array($needle, $haystack, $strict);
    }
    foreach ($haystack as $value) {
        if ($strict ? $needle === $value : $needle == $value) {
            return true;
        }
    }
    return false;
}

            
isIndexed() 公共静态方法

返回一个值,指示给定的数组是否为索引数组。

如果所有键都是整数,则数组为索引数组。如果 $consecutive 为 true,则数组键必须是从 0 开始的连续序列。

请注意,空数组将被视为索引数组。

public static boolean isIndexed ( $array, $consecutive false )
$array array

正在检查的数组

$consecutive boolean

为了将数组视为索引数组,数组键是否必须是连续序列。

返回值 boolean

数组是否为索引数组

                public static function isIndexed($array, $consecutive = false)
{
    if (!is_array($array)) {
        return false;
    }
    if (empty($array)) {
        return true;
    }
    $keys = array_keys($array);
    if ($consecutive) {
        return $keys === array_keys($keys);
    }
    foreach ($keys as $key) {
        if (!is_int($key)) {
            return false;
        }
    }
    return true;
}

            
isSubset() 公共静态方法 (从版本 2.0.7 开始可用)

检查数组或 可遍历对象 是否为另一个数组或 可遍历对象 的子集。

如果 $needles 的所有元素都包含在 $haystack 中,则此方法将返回 true。如果至少缺少一个元素,则返回 false

public static boolean isSubset ( $needles, $haystack, $strict false )
$needles 可迭代对象

必须全部位于 $haystack 中的值。

$haystack 可迭代对象

要搜索的值集。

$strict boolean

是否启用严格 (===) 比较。

返回值 boolean

如果 $needles$haystack 的子集,则为 true,否则为 false

抛出 yii\base\InvalidArgumentException

如果 $haystack$needles 既不可遍历也不为数组。

                public static function isSubset($needles, $haystack, $strict = false)
{
    if (!static::isTraversable($needles)) {
        throw new InvalidArgumentException('Argument $needles must be an array or implement Traversable');
    }
    foreach ($needles as $needle) {
        if (!static::isIn($needle, $haystack, $strict)) {
            return false;
        }
    }
    return true;
}

            
isTraversable() 公共静态方法 (从版本 2.0.8 开始可用)

检查变量是否为数组或 可遍历对象

此方法与 PHP 函数 is_array() 相同,但此外它还适用于实现了 Traversable 接口的对象。

另见 https://php.ac.cn/manual/en/function.is-array.php

public static boolean isTraversable ( $var )
$var 混合

正在评估的变量。

返回值 boolean

是否可以通过 foreach 遍历 $var

                public static function isTraversable($var)
{
    return is_array($var) || $var instanceof Traversable;
}

            
keyExists() public static method

检查给定数组是否包含指定的键。

此方法增强了 array_key_exists() 函数,支持不区分大小写的键比较。

public static boolean keyExists ( $key, $array, $caseSensitive true )
$key string|integer

要检查的键

$array array|ArrayAccess

具有要检查键的数组

$caseSensitive boolean

键比较是否区分大小写

返回值 boolean

数组是否包含指定的键

                public static function keyExists($key, $array, $caseSensitive = true)
{
    // ToDo: This check can be removed when the minimum PHP version is >= 8.1 (Yii2.2)
    if (is_float($key)) {
        $key = (int)$key;
    }
    if ($caseSensitive) {
        if (is_array($array) && array_key_exists($key, $array)) {
            return true;
        }
        // Cannot use `array_has_key` on Objects for PHP 7.4+, therefore we need to check using [[ArrayAccess::offsetExists()]]
        return $array instanceof ArrayAccess && $array->offsetExists($key);
    }
    if ($array instanceof ArrayAccess) {
        throw new InvalidArgumentException('Second parameter($array) cannot be ArrayAccess in case insensitive mode');
    }
    foreach (array_keys($array) as $k) {
        if (strcasecmp($key, $k) === 0) {
            return true;
        }
    }
    return false;
}

            
map() public static method

从多维数组或对象数组构建映射(键值对)。

$from$to 参数指定要设置映射的键名或属性名。可选地,可以使用一个分组字段 $group 来进一步对映射进行分组。

例如,

$array = [
    ['id' => '123', 'name' => 'aaa', 'class' => 'x'],
    ['id' => '124', 'name' => 'bbb', 'class' => 'x'],
    ['id' => '345', 'name' => 'ccc', 'class' => 'y'],
];

$result = ArrayHelper::map($array, 'id', 'name');
// the result is:
// [
//     '123' => 'aaa',
//     '124' => 'bbb',
//     '345' => 'ccc',
// ]

$result = ArrayHelper::map($array, 'id', 'name', 'class');
// the result is:
// [
//     'x' => [
//         '123' => 'aaa',
//         '124' => 'bbb',
//     ],
//     'y' => [
//         '345' => 'ccc',
//     ],
// ]
public static array map ( $array, $from, $to, $group null )
$array array
$from string|Closure
$to string|Closure
$group string|Closure|null

                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;
}

            
merge() public static method

将两个或多个数组递归地合并为一个。

如果每个数组都有一个具有相同字符串键值的元素,则后者将覆盖前者(与 array_merge_recursive 不同)。如果两个数组都具有数组类型的元素并且具有相同的键,则将执行递归合并。对于整数键元素,来自后者的数组的元素将附加到前者的数组。可以使用 yii\helpers\UnsetArrayValue 对象从之前的数组中取消设置值,或者使用 yii\helpers\ReplaceArrayValue 强制替换之前的值而不是进行递归合并。

public static array merge ( $a, $b )
$a array

要合并到的数组

$b array

要从中合并的数组。您可以通过第三个参数、第四个参数等指定其他数组。

返回值 array

合并后的数组(原始数组不会改变)。

                public static function merge($a, $b)
{
    $args = func_get_args();
    $res = array_shift($args);
    while (!empty($args)) {
        foreach (array_shift($args) as $k => $v) {
            if ($v instanceof UnsetArrayValue) {
                unset($res[$k]);
            } elseif ($v instanceof ReplaceArrayValue) {
                $res[$k] = $v->value;
            } elseif (is_int($k)) {
                if (array_key_exists($k, $res)) {
                    $res[] = $v;
                } else {
                    $res[$k] = $v;
                }
            } elseif (is_array($v) && isset($res[$k]) && is_array($res[$k])) {
                $res[$k] = static::merge($res[$k], $v);
            } else {
                $res[$k] = $v;
            }
        }
    }
    return $res;
}

            
multisort() public static method

根据一个或多个键对对象或数组(具有相同结构)的数组进行排序。

public static void multisort ( &$array, $key, $direction SORT_ASC, $sortFlag SORT_REGULAR )
$array array

要排序的数组。调用此方法后,数组将被修改。

$key string|Closure|array

要排序的键。这指的是子数组元素的键名、对象的属性名或返回用于比较目的的值的匿名函数。匿名函数签名应为:function($item)。要按多个键排序,请在此处提供一个键数组。

$direction integer|array

排序方向。它可以是 SORT_ASCSORT_DESC。当按多个键以不同的排序方向排序时,使用排序方向数组。

$sortFlag integer|array

PHP 排序标志。有效值包括 SORT_REGULARSORT_NUMERICSORT_STRINGSORT_LOCALE_STRINGSORT_NATURALSORT_FLAG_CASE。有关更多详细信息,请参阅 PHP 手册。当按多个键以不同的排序标志排序时,使用排序标志数组。

抛出 yii\base\InvalidArgumentException

如果 $direction 或 $sortFlag 参数的元素数量与 $key 不一致。

                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 InvalidArgumentException('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 InvalidArgumentException('The length of $sortFlag parameter must be the same as that of $keys.');
    }
    $args = [];
    foreach ($keys as $i => $k) {
        $flag = $sortFlag[$i];
        $args[] = static::getColumn($array, $k);
        $args[] = $direction[$i];
        $args[] = $flag;
    }
    // This fix is used for cases when main sorting specified by columns has equal values
    // Without it it will lead to Fatal Error: Nesting level too deep - recursive dependency?
    $args[] = range(1, count($array));
    $args[] = SORT_ASC;
    $args[] = SORT_NUMERIC;
    $args[] = &$array;
    call_user_func_array('array_multisort', $args);
}

            
recursiveSort() public static method

递归地排序数组。

public static array recursiveSort ( array &$array, $sorter null )
$array array

按引用传递的数组。

$sorter callable|null

数组排序器。如果省略,则按值对索引数组进行排序,按键对关联数组进行排序。

                public static function recursiveSort(array &$array, $sorter = null)
{
    foreach ($array as &$value) {
        if (is_array($value)) {
            static::recursiveSort($value, $sorter);
        }
    }
    unset($value);
    if ($sorter === null) {
        $sorter = static::isIndexed($array) ? 'sort' : 'ksort';
    }
    call_user_func_array($sorter, [&$array]);
    return $array;
}

            
remove() public static method

从数组中删除一项并返回该值。如果数组中不存在该键,则将返回默认值。

使用方法示例,

// $array = ['type' => 'A', 'options' => [1, 2]];
// working with array
$type = \yii\helpers\ArrayHelper::remove($array, 'type');
// $array content
// $array = ['options' => [1, 2]];
public static mixed|null remove ( &$array, $key, $default null )
$array array

要从中提取值的数组

$key string

数组元素的键名

$default 混合

如果指定键不存在,则返回的默认值

返回值 mixed|null

如果找到元素的值,否则为默认值

                public static function remove(&$array, $key, $default = null)
{
    // ToDo: This check can be removed when the minimum PHP version is >= 8.1 (Yii2.2)
    if (is_float($key)) {
        $key = (int)$key;
    }
    if (is_array($array) && array_key_exists($key, $array)) {
        $value = $array[$key];
        unset($array[$key]);
        return $value;
    }
    return $default;
}

            
removeValue() public static method (available since version 2.0.11)

从数组中删除具有匹配值的项,并返回已删除的项。

示例,

$array = ['Bob' => 'Dylan', 'Michael' => 'Jackson', 'Mick' => 'Jagger', 'Janet' => 'Jackson'];
$removed = \yii\helpers\ArrayHelper::removeValue($array, 'Jackson');
// result:
// $array = ['Bob' => 'Dylan', 'Mick' => 'Jagger'];
// $removed = ['Michael' => 'Jackson', 'Janet' => 'Jackson'];
public static array removeValue ( &$array, $value )
$array array

要在其中查找值的数组

$value 混合

要从数组中删除的值

返回值 array

从数组中删除的项目

                public static function removeValue(&$array, $value)
{
    $result = [];
    if (is_array($array)) {
        foreach ($array as $key => $val) {
            if ($val === $value) {
                $result[$key] = $val;
                unset($array[$key]);
            }
        }
    }
    return $result;
}

            
setValue() public static method (available since version 2.0.13)

在指定的键路径处将值写入关联数组。

如果还没有这样的键路径,它将被递归创建。如果键存在,它将被覆盖。

 $array = [
     'key' => [
         'in' => [
             'val1',
             'key' => 'val'
         ]
     ]
 ];

ArrayHelper::setValue($array, 'key.in.0', ['arr' => 'val']); 的结果将是以下内容

 [
     'key' => [
         'in' => [
             ['arr' => 'val'],
             'key' => 'val'
         ]
     ]
 ]

ArrayHelper::setValue($array, 'key.in', ['arr' => 'val']);ArrayHelper::setValue($array, ['key', 'in'], ['arr' => 'val']); 的结果将是以下内容

 [
     'key' => [
         'in' => [
             'arr' => 'val'
         ]
     ]
 ]
public static void setValue ( &$array, $path, $value )
$array array

要写入值的数组

$path string|array|null

要写入值的路径 $array 路径可以使用字符串描述,其中每个键都应该用点隔开,您也可以使用键数组描述路径,如果路径为 null,则 $array 将被分配 $value

$value 混合

要写入的值

                public static function setValue(&$array, $path, $value)
{
    if ($path === null) {
        $array = $value;
        return;
    }
    $keys = is_array($path) ? $path : explode('.', $path);
    while (count($keys) > 1) {
        $key = array_shift($keys);
        if (!isset($array[$key])) {
            $array[$key] = [];
        }
        if (!is_array($array[$key])) {
            $array[$key] = [$array[$key]];
        }
        $array = &$array[$key];
    }
    $array[array_shift($keys)] = $value;
}

            
toArray() 公共静态方法

将对象或对象数组转换为数组。

public static array toArray ( $object, $properties = [], $recursive true )
$object object|array|string

要转换为数组的对象

$properties array

一个从对象类名到需要放入结果数组的属性的映射。为每个类指定的属性是一个以下格式的数组

[
    'app\models\Post' => [
        'id',
        'title',
        // the key name in array result => property name
        'createTime' => 'created_at',
        // the key name in array result => anonymous function
        'length' => function ($post) {
            return strlen($post->content);
        },
    ],
]

ArrayHelper::toArray($post, $properties) 的结果可能如下所示

[
    'id' => 123,
    'title' => 'test',
    'createTime' => '2013-01-01 12:00AM',
    'length' => 301,
]
$recursive boolean

是否递归地将作为对象的属性转换为数组。

返回值 array

对象的数组表示形式

                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 ($object instanceof \DateTimeInterface) {
        return (array)$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;
    }
    return [$object];
}