2011-01-20 2 views
0

Я ищу элегантный подход для преобразования $array в $object.Преобразование определенного массива в объект

Если $array содержит Array ([0] => en=english [1] => fr=french) полученный $object должен содержать stdClass Object ([en] => english [fr] => french)

Самый элегантный подход был бы тот, который использует наименьшее количество имен переменных.

ответ

2

Вы также можете использовать parse_ini_string

$object = (object) parse_ini_string(join(PHP_EOL, $array)); 

Пока все ваши ценности key=val это будет работать.

Все правила ини файлы применяются, то есть он будет задыхаться на foo=bar=baz но не на foo="bar=baz", поскольку INI-файлы позволяют дополнительно =, когда он помещается в кавычки.


Если вы не на PHP 5.3, то вы можете использовать parse_ini_file принять присоединившееся содержимое массив из data stream wrapper. Это требует, чтобы в вашем php.ini был включен allow_url_include.

$object = (object) parse_ini_file(
    'data:text/plain,' . urlencode(join(PHP_EOL, $array)) 
); 

В обоих случаях выход такой же.

+0

Блестящий! Это именно тот ответ, на который я надеялся. Btw, передает PHP_EOL? Кажется, он работает только с одним аргументом - 'join ($ array)'. –

+1

@ Эмануил Вы уверены? Это не работает для меня, когда я опускаю 'PHP_EOL'.В ini-файле новые записи разделяются новыми строками, поэтому я бы сказал, что вы должны их иметь. – Gordon

+0

@ Gordon, нет, вы правы - это не так. Я пропустил это, потому что сначала тестировал его на одном массиве элементов. Я быстро посмеялся. Я извиняюсь. –

4

должны это сделать:

$object = new stdClass(); 

$array = array('en=english','fr=french', 'foo=bar=baz'); 
foreach($array as $item){ 
    list($name, $value) = explode('=', $item, 2); 
    $object->$name = $value; 
} 
+1

Это не тот массив, который он использует ... –

+0

Не работает, если у вас есть элемент «foo = bar = test». Хотя, пример в вопросе не имеет такого случая. –

+1

Это мое плохое для неправильного копирования примера! Я исправил это. –

2

Лучший способ сделать это:

<?php 
$arr = array('en=english','test=blaat','foo=bar=test'); 


foreach ($arr as $item) 
{ 
    $opts = explode('=',$item); 
    $name = array_shift($opts); 
    $obj->$name = implode('=',$opts); 
} 

print_r($obj); 

Возвращает:

stdClass Object 
( 
    [en] => english 
    [test] => blaat 
    [foo] => bar=test 
) 
1

Вы могли бы сделать это

foreach ($arr as $item) 
{ 
    $things=explode('=',$item); 
    $newArray[$things[0]]=$things[1]; 
} 
$obj=(object) $newArray; 
+0

Одинаковая проблема здесь: не работает, если у вас есть элемент «foo = bar = test». –

+1

@Pelle ten Cate: Поскольку OP не разместил этот тип примера. Ответ полностью основан на показанных примерах. –

+1

У вас там есть точка. Хотя, если бы этот пример был бы единственным случаем, с которым он хотел справиться, просто установление значений вручную было бы еще быстрее. :) –

Смежные вопросы