PHP中的二维数组转化为对象数组

6
我正在尝试将关联数组转换为对象数组。
$assoc = array (
array(
    'prop1'=>'val1',
    'prop2'=>'val2',
),

array(
    'prop1'=>'val1',
    'prop2'=>'val2',
),
)

这是我目前的代码:

class Assoc {
public function setObject($assoc) {
    $this->assoc[] = new Obj($assoc);
}
}
class Obj {
public function __construct($item) {
    foreach ( $item as $property=>$value ) {
        $this->{$property} = $value;
    }
}
}

$test = New Assoc();
$test->setObject($assoc);

这段代码适用于单个数组,但不适用于数组的数组。如果您能帮助我解决在setObject函数中的循环问题。


1
$input是什么?它在哪里定义的? - Brigand
抱歉,在试图将代码泛化时,我错过了更改一些变量。它们都是$assoc并在帖子中更新。 - Matthew Sprankle
4个回答

8

将关联数组转换为对象数组:

$output = array_map(function($element) {
    return (object) $element;
}, $assoc);

很简单。

编辑:如果您需要创建特定类的对象:

$output = array_map(function($element) use ($classType) {
    return new $classType($element);
}, $assoc);

你可以将它推广到任何东西上,确实如此。

注意:结束代码为public function setInput($assoc) { $this->assoc= array_map(function($item){return new Input($item);}, $assoc); } - Matthew Sprankle
你真的,真的不需要为此创建类。PHP已经有两种类型的数组:内置数组和SPL“固定”数组。如果需要哈希表语义,请使用第一个;如果需要固定大小的数组,请使用第二个。__不要__创建自己的包装器。 - jmkeyes

6

针对特定对象进行编辑:

为了尽可能地保持与现有样式的一致性,而不会干扰数组映射操作:

class Assoc {
  public function setObject($assoc) {
    foreach ($assoc as $arr) {
      $this->assoc[] = new Obj($arr);
    }   
  }
}
class Obj {
   public function __construct($item) {
     foreach ( $item as $property=>$value ) { 
       $this->{$property} = $value;
     }  
   }   
}

$test = New Assoc();
$test->setObject($assoc);

Translated:

如果您只需要通用转换,而不是特定的自定义对象(您的帖子中并不十分清楚?),您可以尝试这个方法:

$new_array = array();
foreach ($assoc as $to_obj)
{
  $new_array[] = (object)$to_obj;
}

// Print results
var_dump($new_array);

输出:

array(2) {
  [0]=>
  object(stdClass)#1 (2) {
    ["prop1"]=>
    string(4) "val1"
    ["prop2"]=>
    string(4) "val2"
  }
  [1]=>
  object(stdClass)#2 (2) {
    ["prop1"]=>
    string(4) "val1"
    ["prop2"]=>
    string(4) "val2"
  }
}

我正在寻找类似的输出到一个特定的对象中。 - Matthew Sprankle
我正在尝试:foreach ($assoc as $to_obj) { $this->assoc[] = new Obj($to_obj); }但是得到了“invalid argument supplied for foreach”的错误提示。 - Matthew Sprankle
array_map 被认为是“巫术”吗? - jmkeyes

1
$len = count($assoc);
for($i=0;$i<$len; $i++){
    $assoc[$i] = (Object)$assoc[$i];
}

0

你有一个关联数组的索引数组。如果你将它转换为json,然后使用json_decode()的默认行为将其转换回可迭代状态,则顶层(索引数组)将被强制转换为数组类型,而子数组将变为对象类型。

请注意,此转换将贯穿所有后续数据级别(以防研究人员可能具有更深层次的数据结构)。实际上,索引数组仍然保持索引数组,而关联数组则变成了对象。

这是一个如此基本的调用,以至于我不确定是否需要为其创建包装器。

代码:(演示

$assoc = array (
    array(
        'prop1'=>'val1',
        'prop2'=>'val2',
    ),
    array(
        'prop1'=>'val1',
        'prop2'=>'val2',
    ),
);

var_export(
    json_decode(json_encode($assoc))
);

输出:

array (
  0 => 
  (object) array(
     'prop1' => 'val1',
     'prop2' => 'val2',
  ),
  1 => 
  (object) array(
     'prop1' => 'val1',
     'prop2' => 'val2',
  ),
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接