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() 配列またはTraversableに要素が含まれているかどうかを確認します。 yii\helpers\BaseArrayHelper
isIndexed() 指定された配列がインデックス付き配列であるかどうかを示す値を返します。 yii\helpers\BaseArrayHelper
isSubset() 配列またはTraversableが別の配列またはTraversableのサブセットであるかどうかを確認します。 yii\helpers\BaseArrayHelper
isTraversable() 変数が配列またはTraversableであるかどうかを確認します。 yii\helpers\BaseArrayHelper
keyExists() 指定されたキーが配列に含まれているかどうかを確認します。 yii\helpers\BaseArrayHelper
map() 多次元配列またはオブジェクトの配列からマップ(キーと値のペア)を構築します。 yii\helpers\BaseArrayHelper
merge() 2つ以上の配列を再帰的に1つにマージします。 yii\helpers\BaseArrayHelper
multisort() オブジェクトまたは配列(同じ構造)の配列を、1つまたは複数のキーでソートします。 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 メソッド (バージョン 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 配列

ソース配列

$filters 反復可能

結果から残すか削除する必要がある配列キーを定義するルール。各ルールは

  • var - $array['var'] が結果に残ります。
  • var.key = `$array['var']['key'] のみが結果に残ります。
  • !var.key = `$array['var']['key'] が結果から削除されます。
return 配列

フィルタリングされた配列

                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 メソッド

配列内の指定された列の値を返します。

入力配列は、多次元配列またはオブジェクトの配列である必要があります。

例:

$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 配列
$name integer|string|array|Closure
$keepKeys boolean

配列のキーを保持するかどうか。falseの場合、結果の配列は整数で再インデックスされます。

return 配列

列の値のリスト

                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 メソッド

指定されたキーまたはプロパティ名を持つ配列要素またはオブジェクトプロパティの値を取得します。

配列にキーが存在しない場合、代わりにデフォルト値が返されます。オブジェクトから値を取得する場合は使用されません。

キーは、サブ配列の値または埋め込みオブジェクトのプロパティを取得するために、ドット形式で指定できます。特に、キーが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 mixed

指定された配列キーが存在しない場合に返されるデフォルト値。オブジェクトから値を取得する場合は使用されません。

return mixed

要素が見つかった場合はその値、それ以外の場合はデフォルト値

                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() public static メソッド

文字列の配列内のHTMLエンティティを対応する文字にデコードします。

デフォルトでは、配列の値のみがデコードされます。値が配列の場合、このメソッドは再帰的にデコードします。文字列の値のみがデコードされます。

参照: https://www.php.net/manual/en/function.htmlspecialchars-decode.php

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

デコードされるデータ

$valuesOnly boolean

配列の値のみをデコードするかどうか。falseの場合、配列のキーと配列の値の両方がデコードされます。

return 配列

デコードされたデータ

                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() public static メソッド

文字列の配列内の特殊文字をHTMLエンティティにエンコードします。

デフォルトでは、配列の値のみがエンコードされます。値が配列の場合、このメソッドは再帰的にエンコードします。文字列の値のみがエンコードされます。

参照: https://www.php.net/manual/en/function.htmlspecialchars.php

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

エンコードされるデータ

$valuesOnly boolean

配列の値のみをエンコードするかどうか。falseの場合、配列のキーと配列の値の両方がエンコードされます。

$charset string|null

データで使用されている文字セット。設定されていない場合、yii\base\Application::$charsetが使用されます。

return 配列

エンコードされたデータ

                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() public static メソッド

指定されたキーに従って配列のインデックスを作成および/またはグループ化します。

入力は多次元配列またはオブジェクトの配列のいずれかである必要があります。

$keyは、サブ配列のキー名、オブジェクトのプロパティ名、またはキーとして使用される値を返す匿名関数のいずれかになります。

$groupsはキーの配列であり、指定されたキーに基づいて入力配列を1つ以上のサブ配列にグループ化するために使用されます。

$keynullとして指定されているか、キーに対応する要素の値が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'];
});

3番目の引数としてidを渡すと、$arrayidでグループ化されます。

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

結果は、最初のレベルでid、2番目のレベルでdeviceでグループ化され、3番目のレベルで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、2番目のレベルでdevice、3番目のレベルで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 配列

インデックス付けまたはグループ化する必要がある配列

$key string|Closure|null

配列のインデックス付けに使用される列名または匿名関数

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

1つ以上のキーで入力配列をグループ化するために使用されるキーの配列。特定の要素の$key属性またはその値がnullであり、$groupsが定義されていない場合、配列要素は破棄されます。それ以外の場合、$groupsが指定されている場合、配列要素はキーなしで結果配列に追加されます。このパラメータはバージョン2.0.8から利用可能です。

return 配列

インデックス付けおよび/またはグループ化された配列

                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() public static メソッド

指定された配列が連想配列であるかどうかを示す値を返します。

配列のすべてのキーが文字列の場合、その配列は連想配列です。$allStringsがfalseの場合、少なくとも1つのキーが文字列である場合に、配列は連想配列として扱われます。

空の配列は連想配列とはみなされないことに注意してください。

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

チェックされる配列

$allStrings boolean

配列を連想配列として扱うためには、配列のキーがすべて文字列である必要があるかどうか。

return 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() public static メソッド (バージョン2.0.7以降で利用可能)

配列またはTraversableに要素が含まれているかどうかを確認します。

このメソッドはPHP関数in_array()と同じ動作をしますが、さらにTraversableインターフェースを実装するオブジェクトに対しても動作します。

参照: https://www.php.net/manual/en/function.in-array.php

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

検索する値。

$haystack 反復可能

検索対象の値のセット。

$strict boolean

厳密な (===) 比較を有効にするかどうか。

return boolean

$needle$haystack 内に見つかった場合は true、それ以外の場合は false

throws yii\base\InvalidArgumentException

$haystack が traversable でもなく配列でもない場合。

                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() public static method

指定された配列がインデックス付き配列であるかどうかを示す値を返します。

配列のキーがすべて整数である場合、その配列はインデックス付きであるとみなされます。$consecutive が true の場合、配列キーは 0 から始まる連続したシーケンスである必要があります。

空の配列はインデックス付きとみなされることに注意してください。

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

チェックされる配列

$consecutive boolean

配列をインデックス付きとして扱うためには、配列キーが連続したシーケンスである必要があるかどうか。

return 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() public static method (available since version 2.0.7)

配列またはTraversableが別の配列またはTraversableのサブセットであるかどうかを確認します。

このメソッドは、$needles のすべての要素が $haystack に含まれている場合に true を返します。少なくとも 1 つの要素が欠落している場合は、false が返されます。

public static boolean isSubset ( $needles, $haystack, $strict false )
$needles 反復可能

$haystack 内にすべて含まれている必要がある値。

$haystack 反復可能

検索対象の値のセット。

$strict boolean

厳密な (===) 比較を有効にするかどうか。

return boolean

$needles$haystack のサブセットである場合は true、それ以外の場合は false

throws yii\base\InvalidArgumentException

$haystack または $needles が traversable でもなく配列でもない場合。

                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() public static method (available since version 2.0.8)

変数が配列またはTraversableであるかどうかを確認します。

このメソッドは、PHP 関数 is_array() と同じ動作をしますが、さらに Traversable インターフェイスを実装するオブジェクトでも動作します。

https://www.php.net/manual/en/function.is-array.php も参照してください。

public static boolean isTraversable ( $var )
$var mixed

評価対象の変数。

return boolean

$var が foreach でトラバース可能かどうか

                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

キーの比較で大文字と小文字を区別する必要があるかどうか

return 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 配列
$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

2つ以上の配列を再帰的に1つにマージします。

各配列に同じ文字列キー値を持つ要素がある場合、後者が前者(array_merge_recursiveとは異なる)を上書きします。両方の配列が配列型の要素を持ち、同じキーを持っている場合、再帰的なマージが実行されます。整数キー付き要素の場合、後者の配列からの要素が前者の配列に追加されます。yii\helpers\UnsetArrayValue オブジェクトを使用して前の配列から値を設定解除したり、yii\helpers\ReplaceArrayValue を使用して、再帰的なマージの代わりに以前の値を強制的に置き換えることができます。

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

マージ先の配列

$b 配列

マージ元の配列。3 番目の引数、4 番目の引数などを介して追加の配列を指定できます。

return 配列

マージされた配列 (元の配列は変更されません)。

                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

オブジェクトまたは配列(同じ構造)の配列を、1つまたは複数のキーでソートします。

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

ソートする配列。このメソッドを呼び出した後、配列が変更されます。

$key string|Closure|array

ソート対象のキー。これは、サブ配列要素のキー名、オブジェクトのプロパティ名、または比較目的で値を返す匿名関数を指します。匿名関数の署名は次のようになります: function($item)。複数のキーでソートするには、ここにキーの配列を指定します。

$direction integer|array

ソートの方向。SORT_ASC または SORT_DESC のいずれかになります。異なるソート方向を持つ複数のキーでソートする場合は、ソート方向の配列を使用します。

$sortFlag integer|array

PHP のソート フラグ。有効な値には、SORT_REGULARSORT_NUMERICSORT_STRINGSORT_LOCALE_STRINGSORT_NATURAL、および SORT_FLAG_CASE が含まれます。詳細については、PHP マニュアルを参照してください。異なるソート フラグを持つ複数のキーでソートする場合は、ソート フラグの配列を使用します。

throws 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 配列

参照渡しによる配列。

$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 配列

値を取り出す配列

$key string

配列要素のキー名

$default mixed

指定されたキーが存在しない場合に返されるデフォルト値

return 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 メソッド (バージョン 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 配列

値を検索する配列

$value mixed

配列から削除する値

return 配列

配列から削除された項目

                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 メソッド (バージョン 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 配列

値を書き込む配列

$path string|array|null

$array に値を書き込む場所のパス。各キーをドットで区切る文字列でパスを記述できます。また、キーの配列としてパスを記述することもできます。パスが null の場合は、$array$value が代入されます。

$value mixed

書き込む値

                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 メソッド

オブジェクトまたはオブジェクトの配列を配列に変換します。

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

配列に変換するオブジェクト

$properties 配列

オブジェクトのクラス名から、結果の配列に含める必要のあるプロパティへのマッピング。各クラスに指定されたプロパティは、次の形式の配列です。

[
    '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

オブジェクトであるプロパティを再帰的に配列に変換するかどうか。

return 配列

オブジェクトの配列表現

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