- How to check if variable is array. or something array-like
- 7 Answers 7
- is_array
- Examples
- See Also
- php is variable an array or object
- 6 Answers 6
- object (use is_object)——
- Example
- PHP >= 8.1
- PHP < 8.1
- Проверка на массив, на наличие элементов и на пустоту в PHP
- Проверка массива на пустоту и пустые элементы в PHP
- Проверить наличие элемента в массиве
How to check if variable is array. or something array-like
I want to use a foreach loop with a variable, but this variable can be many different types, NULL for example. So before foreach I test it:
But I realized that it can also be a class that implements Iterator interface. Maybe I am blind but how to check whether the class implements interface? Is there something like is_a function or inherits operator? I found class_implements , I can use it, but maybe there is something simpler? And second, more important, I suppose this function exist, would be enough to check if the variable is_array or «implements Iterator interface» or should I test for something more?
7 Answers 7
If you are using foreach inside a function and you are expecting an array or a Traversable object you can type hint that function with:
function myFunction(array $a) function myFunction(Traversable)
If you are not using foreach inside a function or you are expecting both you can simply use this construct to check if you can iterate over the variable:
if (is_array($a) or ($a instanceof Traversable))
I had found is_array to be expensive. The computational cost seemed to increase with the size of array (which makes no sense since it’s just checking if it’s an array). But it happened to me shockingly in a library. See my comment in the linked question. Will instanceof Traversable work with arrays? I didn’t get the chance to test its performance.
@Shoe I tried it here. With $var = array(1,2,3); the results are: is_array($var) = true and $var instanceof Traversable = false .
@ADTC Yeah, just checked. Arrays do not implement Iterator and therefore don’t work with Traversable .
foreach can handle arrays and objects. You can check this with:
$can_foreach = is_array($var) || is_object($var); if ($can_foreach)
You don’t need to specifically check for Traversable as others have hinted it in their answers, because all objects — like all arrays — are traversable in PHP.
foreach works with all kinds of traversables, i.e. with arrays, with plain objects (where the accessible properties are traversed) and Traversable objects (or rather objects that define the internal get_iterator handler).
Simply said in common PHP programming, whenever a variable is
you can use foreach on it.
You can check instance of Traversable with a simple function. This would work for all this of Iterator because Iterator extends Traversable
returns bool(false) or bool(true)
PHP 7.1.0 has introduced the iterable pseudo-type and the is_iterable() function, which is specially designed for such a purpose:
This […] proposes a new iterable pseudo-type. This type is analogous to callable , accepting multiple types instead of one single type.
iterable accepts any array or object implementing Traversable . Both of these types are iterable using foreach and can be used with yield from within a generator.
function foo(iterable $iterable) < foreach ($iterable as $value) < // . >>
This […] also adds a function is_iterable() that returns a boolean: true if a value is iterable and will be accepted by the iterable pseudo-type, false for other values.
var_dump(is_iterable([1, 2, 3])); // bool(true) var_dump(is_iterable(new ArrayIterator([1, 2, 3]))); // bool(true) var_dump(is_iterable((function () < yield 1; >)())); // bool(true) var_dump(is_iterable(1)); // bool(false) var_dump(is_iterable(new stdClass())); // bool(false)
You can also use the function is_array($var) to check if the passed variable is an array:
is_array
Возвращает true если value является массивом, иначе — false .
Examples
Пример # 1 Убедитесь, что переменная является массивом
$yes = array('this', 'is', 'an array'); echo is_array($yes) ? 'Array' : 'not an Array'; echo "\n"; $no = 'this is a string'; echo is_array($no) ? 'Array' : 'not an Array'; ?>
Выводится приведенный выше пример:
See Also
- is_float () — Проверяет , является ли тип переменной float
- is_int () — определяет, является ли тип переменной целым числом
- is_string () — Узнает , является ли переменная строковым
- is_object () — Проверяет , является ли переменная объектом
PHP 8.2
(PHP 4 4.2.0,5,7,8)is_a Проверяет,является ли объект данного класса или имеет одного из его родителей Проверяет,является ли данный объект_или_класс данным и имеет ли одного из его родителей.
(PHP 4,5,7,8)is_bool Выясняет,является ли переменная булевой Выясняет,является ли данная переменная булевой.
(PHP 4 4.0.6,5,7,8)is_callable Убедитесь,что значение может быть вызвано как функция из текущей области видимости.
php is variable an array or object
Trying to figure out how to do the equivalent of something I did in javascript but in php. But I’m not sure of the operators to do it. In javascript I wanted to see if a particular parameter being passed was either an object or array.. and if not then was it a string/int and what I did was something like
if (str instanceof Array || str instanceof Object) < //code >else < //code >
6 Answers 6
Use is_array to check if a variable is an array, and similarly, use is_object to check if a variable is an object.
yea, its funny.. no sooner than I typed it out.. i remembered is_array then I looked up to see if theres similar for objects.. im super clever like that today apparently, thanks. By the way is there by chance anything like this for JSON cause I’d like to throw that in my mix so if it is JSON i can decode/encode accordingly to work with it
You should never optimize prematurely, but if is_array($var) turns out to be your bottleneck after profiling then (array) $var === $var is more performant
PHP.net says: Note: is_scalar() does not consider resource type values to be scalar as resources are abstract datatypes which are currently based on integers. This implementation detail should not be relied upon, as it may change.
object (use is_object)——
stdClass Object ( [rest_food_items_id] => 137 [rest_user_id] => 42 )
array (use is_array)—-
Array ( [rest_food_items_id] => 137 [rest_user_id] => 42 )
Example
if(is_object($data)) < >if(is_array($data))
I came across this question while looking for is_countable . Maybe it’s of some use to somebody. https://www.php.net/manual/en/function.is-countable.php
As of PHP 8.0, you can use Union types when writing functions, validating your paramter’s type at runtime:
function test(array|object $something): void < // Here, $something is either an array or an object >
PHP >= 8.1
From PHP 8.1 and above, you can use:
PHP < 8.1
Pure is_array/is_object is unable to judge because:
is_array([0,1,2,3]) // true is_object([0,1,2,3]) // false is_array(['a'=>1,'b'=>2]) // true is_object(['a'=>1,'b'=>2]) // false
Here i wrote a simple function to do it
function isRealObject($arrOrObject)
This answer is technically incorrect because an array is still an array in PHP even if it has gaps in its numeric keys or is associative. Why is this answer upvoted? implode() glue can be omitted when an empty string is the desired glue. It seems that you’ve posted on the wrong page. stackoverflow.com/q/173400/2943403 already covers the topic that you are trying to cover.
@mickmackusa yes it is. but it should be a historical fault in php, in most languages , list array and object is obviously different. if you call json_object/json_array in mysql8 , you will know why we care for this
Проверка на массив, на наличие элементов и на пустоту в PHP
В этой статье будем делать различные проверки массива. В том числе проверим является ли переменная массивом, а так же проверим есть ли у ключей массива пустые значения. Будем двигаться от простого к более сложному. И первое, что можно сделать, это проверить на массив. Для этого нам помоет встроенная в язык PHP функция is_array. Разберем небольшой пример.
$arr = ['id', 'name', 'email']; // Массив элементов if(is_array($arr)){ echo 'Это массив'; }else{ echo 'Это не массив'; }
$arr = [‘id’, ‘name’, ’email’]; // Массив элементов if(is_array($arr))< echo 'Это массив'; >else
Функция вернет true, если это массив и false — если не массив. Это простой пример и сложностей возникнуть не должно. Перейдем к следующему примеру.
Проверка массива на пустоту и пустые элементы в PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$arr = []; if(empty($arr)){ echo 'Массив пустой'; }else{ echo 'Есть элементы'; } // Выведет сообщение, что массив пустой $arr = ['']; if(empty($arr)){ echo 'Массив пустой'; }else{ echo 'Есть элементы'; } // Массив будет не пустым даже если в нем только кавычки.
$arr = []; if(empty($arr))< echo 'Массив пустой'; >else < echo 'Есть элементы'; >// Выведет сообщение, что массив пустой $arr = [»]; if(empty($arr))< echo 'Массив пустой'; >else < echo 'Есть элементы'; >// Массив будет не пустым даже если в нем только кавычки.
Функция empty сработает только в том случае, когда в массиве нет вообще никаких элементов. Поэтому ее лучше не использовать при проверке массивов. В этом случае нам поможет еще одна функция — array_diff. С ее помощью мы сравним исходный массив с другим массивом и в случае расхождения выведем элементы массива, которые не совпадают. Может быть немного сумбурно и не понятно, но давайте разберем на примере.
$arr = ['name', '', 'num', NULL, '', false, 'Alex', '']; var_dump($arr); $new_arr = array_diff($arr, array('', NULL, false)); var_dump($new_arr);
$arr = [‘name’, », ‘num’, NULL, », false, ‘Alex’, »]; var_dump($arr); $new_arr = array_diff($arr, array(», NULL, false)); var_dump($new_arr);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
array(8) { [0]=> string(4) "name" [1]=> string(0) "" [2]=> string(3) "num" [3]=> [4]=> string(0) "" [5]=> [6]=> string(4) "Alex" [7]=> string(0) "" } array(3) { [0]=> string(4) "name" [2]=> string(3) "num" [6]=> string(4) "Alex" }
array(8) < [0]=>string(4) «name» [1]=> string(0) «» [2]=> string(3) «num» [3]=> [4]=> string(0) «» [5]=> [6]=> string(4) «Alex» [7]=> string(0) «» > array(3) < [0]=>string(4) «name» [2]=> string(3) «num» [6]=> string(4) «Alex» >
Функция пропустит все пустые элемент массива, в том числе NULL и false и выведет только те, в которых что-то есть. Мы так же можем проверить какой именно элемент массива был пустой с помощью цикла for.
$arr = ['name', '', 'num', NULL, '', false, 'Alex', '']; for($i=0; $i count($arr); $i++) { if (empty($arr[$i])){ echo "Элемент $i пустой"."
"; }else{ echo "Элемент $i не пустой"."
"; } }
Элемент 0 не пустой Элемент 1 пустой Элемент 2 не пустой Элемент 3 пустой Элемент 4 пустой Элемент 5 пустой Элемент 6 не пустой Элемент 7 пустой
Элемент 0 не пустой Элемент 1 пустой Элемент 2 не пустой Элемент 3 пустой Элемент 4 пустой Элемент 5 пустой Элемент 6 не пустой Элемент 7 пустой
Но массивы бывают разные, в том числе с ключами и значениями. И цикл for в этом случае тоже справится точно так же.
$arr=['age'=> 34,'name'=>'Ivan','city'=>'', 'number'=>'']; for($i=0; $i count($arr); $i++) { if (empty($arr[$i])){ echo "Элемент $i пустой"."
"; }else{ echo "Элемент $i не пустой"."
"; } }
При желании можно принудительно удалить ключи массива, в которых пустые значения. Для этого задействуем цикл foreach и функцию unset.
$arr=['age'=> 34,'name'=>'Ivan','city'=>'', 'number'=>'']; var_dump($arr); foreach ($arr as $key => $value) { if (empty($value)) { //проверrf на пустоту unset($arr[$key]); // Удаляем ключ массива } } var_dump($arr);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
array(4) { ["age"]=> int(34) ["name"]=> string(4) "Ivan" ["city"]=> string(0) "" ["number"]=> string(0) "" } array(2) { ["age"]=> int(34) ["name"]=> string(4) "Ivan" }
array(4) < ["age"]=>int(34) [«name»]=> string(4) «Ivan» [«city»]=> string(0) «» [«number»]=> string(0) «» > array(2) < ["age"]=>int(34) [«name»]=> string(4) «Ivan» >
Проверить наличие элемента в массиве
Для этих целей подойдет функция in_array. Она проверяет на присутствие в массиве значения.
$arr=['age'=> 34,'name'=>'Ivan','city'=>'', 'number'=>'']; if (in_array('Ivan', $arr)) { echo 'YES'; }else{ echo 'NO'; }
$arr=[‘age’=> 34,’name’=>’Ivan’,’city’=>», ‘number’=>»]; if (in_array(‘Ivan’, $arr)) < echo 'YES'; >else
Первым аргументом указываем что будем искать, вторым — где. На этом по работе с массивами окончен. Надеюсь, что вам в нем все было понятно. Но если остались какие-то вопросы, задавайте их в комментариях.