Как привести переменную в массив - PullRequest
31 голосов
/ 12 мая 2011

У меня есть переменная $ v, которая может быть либо одной строкой, либо массивом строк
, и у меня есть код:

$a = array();
if (is_array($v)) {
    $a = $v;
} else {
    $a[] = $v;
}

Как это можно сделать более элегантным способом?(другими словами, как преобразовать переменную в массив)

Ответы [ 7 ]

60 голосов
/ 12 мая 2011

Вы можете преобразовать переменную в массив, используя:

    $var = (array)$arr;
17 голосов
/ 12 мая 2011
$a = (array) $v;

- это ответ.

8 голосов
/ 12 мая 2011

Я бы написал ваш фрагмент кода вот так (коротко, вы читаете его и точно знаете, что происходит):

$a = is_array($v) ? $v : array($v);
3 голосов
/ 12 мая 2011

В качестве альтернативы вы можете использовать settype:

settype($a, "array");

Для экспликации типа переменной. Это точно так же, как то, что происходит за кулисами. (Более полезно для групповой типизации, например, в циклах.)

1 голос
/ 12 июня 2017

Если вы хотите преобразовать объект в массив с одним счетчиком, вы можете использовать следующий код:

$list = array([0] => $obj);

Другие предоставленные ответы не будут работать при попытке конвертировать объект, он просто преобразует поля этого объекта в ассоциативный массив (если это не то, что вы пытаетесь сделать).

$var = (array)$arr;
0 голосов
/ 31 октября 2018

Как уже говорили другие, приведение значения scalar к массиву приведет к созданию одноэлементного массива (т. Е. Массива со скаляром в качестве единственного элемента).Однако, как уже отмечали другие, старайтесь делать это только в том случае, если вы знаете, что значение будет скалярным, а не экземпляром класса .

Из PHPдокументы :

Для любого из типов integer, float, string, boolean и resource преобразование значения в массив приводит к массиву содин элемент с нулевым индексом и значением скаляра, который был преобразован.Другими словами, (array)$scalarValue в точности совпадает с array($scalarValue).

Если объект преобразуется в массив, результатом является массив, элементы которого являются свойствами объекта.Ключи являются именами переменных-членов, с несколькими заметными исключениями: целочисленные свойства недоступны;закрытые переменные имеют имя класса, добавленное к имени переменной;Защищенные переменные имеют «*» перед именем переменной.Эти предварительно добавленные значения имеют нулевые байты с обеих сторон.

0 голосов
/ 16 октября 2014

На самом деле, если вы хотите привести к массиву и вам не нужно беспокоиться о том, что вы в него поместите, ответ таков:

$var = (is_object($var)) ? array($var) : (array) $var;

Вы можете проверить это с помощью следующего кода

function toArray($var) {
    return (is_object($var)) ? array($var) : (array) $var;
}

$object = new stdClass;
$resource = fopen('php://stdout', 'w');
$closure = function () {};

$tests = array(
    array(toArray(true),      array(true),      'boolean true'),
    array(toArray(false),     array(false),     'boolean false'),
    array(toArray(null),      array(),          'null'),
    array(toArray(1),         array(1),         'positive integer'),
    array(toArray(0),         array(0),         'zero integer'),
    array(toArray(-1),        array(-1),        'negative integer'),
    array(toArray(1.5),       array(1.5),       'positive float'),
    array(toArray(0.0),       array(0.0),       'zero float'),
    array(toArray(-1.5),      array(-1.5),      'negative float'),
    array(toArray(''),        array(''),        'empty string'),
    array(toArray('foo'),     array('foo'),     'string'),
    array(toArray(array()),   array(),          'array'),
    array(toArray($object),   array($object),   'object'),
    array(toArray($resource), array($resource), 'resource'),
    array(toArray($closure),  array($closure),  'closure'),
);

foreach ($tests as $test) {
    ob_start();
    var_dump($test[0]);
    $a = ob_get_clean();
    ob_start();
    var_dump($test[1]);
    $b = ob_get_clean();
    assert($a === $b, "{$test[2]} is not the same");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...