diff --git a/src/utils/__tests__/PhutilUtilsTestCase.php b/src/utils/__tests__/PhutilUtilsTestCase.php --- a/src/utils/__tests__/PhutilUtilsTestCase.php +++ b/src/utils/__tests__/PhutilUtilsTestCase.php @@ -352,6 +352,9 @@ $this->assertEqual(null, idx($array, 'null', false)); $this->assertEqual(null, idx($array, 'missing')); $this->assertEqual(false, idx($array, 'missing', false)); + + $array = new CaseInsensitiveArray(); + $this->assertEqual(null, idx($array, 'key')); } public function testSplitLines() { diff --git a/src/utils/utils.php b/src/utils/utils.php --- a/src/utils/utils.php +++ b/src/utils/utils.php @@ -33,7 +33,14 @@ * @return wild If `$array[$key]` exists, that value is returned. If not, * $default is returned without raising a warning. */ -function idx(array $array, $key, $default = null) { +function idx($array, $key, $default = null) { + if (!(is_array($array) || $array instanceof ArrayAccess)) { + throw new InvalidArgumentException( + sprintf( + 'Argument passed to %s must be an array.', + __FUNCTION__)); + } + // isset() is a micro-optimization - it is fast but fails for null values. if (isset($array[$key])) { return $array[$key];