2016-03-01 54 views
1

我有这样的对象:加入PHP对象键值

stdClass Object 
(
    [transaction] => sale 
    [type] => apartment 
    [city] => washington 
    [rooms] => 1 
) 

我想加入键值,以得到一个字符串:

transaction-sale/type-apartment/city-washington/rooms-1

我设法做到这一点有foreach()和一个空var:

$data = ""; 
foreach($obj as $key => $o): 
    $data = $data."/$key-$o"; 
endforeach; 

但是,这似乎是丑陋的,我错过任何核心PHP函数那可以轻松做到这一点?

+0

'$ data =“”; foreach($ obj as $ key => $ o): $ data。= $ key .'-'。$ o。'/'; endforeach; $ data = trim('/',$ data); echo $ data;' –

+0

试试这个,让我知道 –

+0

没有核心功能。你拥有的就足够了。 –

回答

2

没有这个功能的目的,而且这也有URL编码在URL中使用的变量和值的附带好处:

$data = str_replace('=', '-', http_build_query($object, null, '/')); 

要添加第二个办法,虽然这并不URL编码:

$data = implode('/', array_map(function($k, $v){ 
            return "$k-$v"; 
           }, 
           array_keys((array)$object), (array)$object)); 
+0

啊,'array_map'似乎总是忘记了这个函数。好的单线。 – Xorifelse

1

你可能不想要第一个或最后的/,也许它是这样的更好。

foreach($o as $k => $v){ 
    $a[] = "$k-$v"; 
} 

echo implode('/', $a); 

function foo($obj){ 
    foreach($o as $k => $v){ // this will fail if there are any more -public- variables declared in the class. 
    $a[] = "$k-$v"; 
    } 

    return implode('/', $a); 
} 

echo foo($yourobject); 

class foo{ 
    $transaction = 'sale'; 
    $type = 'apartment'; 
    $city = 'washington'; 
    $rooms = 1; 

    function __tostring(){ // or a normal method name. 
    foreach($self as $key => $value){ // this will fail if there are more variables declared in this class. 
     $a[] = "$key-$value"; 
    } 

    return implode('/', $a); 
    } 

    function bar(){ // will always work. 
    return "transaction-{$self->transaction}/type-{$self->type}/city-{$self->city}/rooms-$self->rooms"; 
    } 
} 

echo $myobj; 
echo $myobj->bar(); 

或者这样(或任何以上的它的变化):

$s = "" // must be done to avoid PHP strict errors, code will function anyways. 
foreach($o as $k => $v){ 
    $s .= "$k-$v/"; 
} 
echo substr($s, 0, -1); 

总体而言,我更喜欢第一种方法,但由于你有一个物体它ight实际上可以用它做些事情。

0

首先:http://php.net/manual/en/function.get-object-vars.php

获取你的对象的成员作为一个关联数组,然后:http://php.net/manual/en/function.array-walk.php

这将使:

php > $o = new stdClass(); 
php > $o->transaction = "buy"; 
php > $o->type="house"; 
php > $o->city="Paris"; 
php > $o->rooms=2; 
php > $a = get_object_vars($o); 

然后我会使用http://php.net/manual/en/function.array-walk.php

php > function walk(&$value, $key) { 
php { $value = "$key-$value"; 
php { } 
php > array_walk($a, 'walk'); 
php > var_export(array_values($a)); 
array (
    0 => 'transaction-buy', 
    1 => 'type-house', 
    2 => 'city-Paris', 
    3 => 'rooms-2', 
) 

编辑: 感谢意见:

php > echo implode("/", array_values($a)); 
transaction-buy/type-house/city-Paris/rooms-2 
+0

然后你可能想''implode'在'/'上。 – AbraCadaver