{"id":"87d0e50d4352f6fe","repo":"laravel/framework","slug":"array-value-for-key-s-must-be-a-string-s-foun","errorCode":null,"errorMessage":"Array value for key [%s] must be a string, %s found.","messagePattern":"Array value for key \\[(.+?)\\] must be a string, (.+?) found\\.","errorType":"exception","errorClass":"InvalidArgumentException","httpStatus":null,"severity":"error","filePath":"src/Illuminate/Collections/Arr.php","lineNumber":1193,"sourceCode":"     * @param  int-mask-of<SORT_REGULAR|SORT_NUMERIC|SORT_STRING|SORT_LOCALE_STRING|SORT_NATURAL|SORT_FLAG_CASE>  $options\n     * @return array<TKey, TValue>\n     */\n    public static function sortRecursiveDesc($array, $options = SORT_REGULAR)\n    {\n        return static::sortRecursive($array, $options, SortDirection::Descending);\n    }\n\n    /**\n     * Get a string item from an array using \"dot\" notation.\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public static function string(ArrayAccess|array $array, string|int|null $key, ?string $default = null): string\n    {\n        $value = Arr::get($array, $key, $default);\n\n        if (! is_string($value)) {\n            throw new InvalidArgumentException(\n                sprintf('Array value for key [%s] must be a string, %s found.', $key, gettype($value))\n            );\n        }\n\n        return $value;\n    }\n\n    /**\n     * Conditionally compile classes from an array into a CSS class list.\n     *\n     * @param  array<string, bool>|array<int, string|int>|string  $array\n     * @return ($array is array<string, false> ? '' : ($array is '' ? '' : ($array is array{} ? '' : non-empty-string)))\n     */\n    public static function toCssClasses($array)\n    {\n        $classList = static::wrap($array);\n\n        $classes = [];","sourceCodeStart":1175,"sourceCodeEnd":1211,"githubUrl":"https://github.com/laravel/framework/blob/bd6b5437e6ad87bb49f9b426724f07a9f64e9683/src/Illuminate/Collections/Arr.php#L1175-L1211","documentation":"Thrown by Arr::string() when the value resolved via Arr::get() fails is_string(). Non-string scalars, objects with __toString (they are still not is_string), arrays, bools, ints, or null (missing key, no string default) all trigger it.","triggerScenarios":"Calling Arr::string($data, 'name') when the value is an int ID, an array, an object, or null because the key is missing and $default is null.","commonSituations":"Decoded JSON where a field is sometimes a string and sometimes null; reading an enum backed value; a dot path that lands on an array element instead of a leaf string.","solutions":["Pass a string default: Arr::string($data, 'name', '').","Cast at the source: (string) $value before it lands in the array.","Use Arr::get() + is_string() if the value type legitimately varies.","Fix the dot path so it resolves to a genuine string leaf."],"exampleFix":"// before\n$name = Arr::string($payload, 'customer.name');\n\n// after\n$name = Arr::string($payload, 'customer.name', '');\n// or coerce\n$v = Arr::get($payload, 'customer.name');\n$name = is_string($v) ? $v : (string) $v;","handlingStrategy":"type-guard","validationCode":"$value = Arr::get($payload, 'customer.name');\nif (! is_string($value)) {\n    $value = is_null($value) ? '' : (string) $value;\n}","typeGuard":"function arrayKeyIsString(array $array, string $key): bool {\n    return is_string(Arr::get($array, $key));\n}","tryCatchPattern":"try {\n    $name = Arr::string($payload, 'customer.name', '');\n} catch (\\InvalidArgumentException $e) {\n    $name = (string) Arr::get($payload, 'customer.name', '');\n}","preventionTips":["Pass a string default to Arr::string().","Cast non-string leaves with (string) before reading.","Verify the dot path resolves to a leaf, not an array node."],"tags":["collections","arrays","type-mismatch","laravel"],"analyzedSha":"bd6b5437e6ad87bb49f9b426724f07a9f64e9683","analyzedAt":"2026-08-06T00:28:32.783Z","schemaVersion":2}