【问题标题】:array of arrays to array of objects php数组数组到对象数组php
【发布时间】:2012-01-14 06:33:07
【问题描述】:

我正在尝试将关联数组转换为对象数组。

$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 函数中的循环。

【问题讨论】:

  • 什么是$input?它是在哪里定义的?
  • 抱歉,在尝试概括代码时,我错过了更改一些变量。它们都是 $assoc 并在帖子中更新。

标签: php arrays object


【解决方案1】:

编辑特定对象:

在不与 array_map voodoo 混淆的情况下尽可能地坚持现有的风格:

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);

原文:

如果您只需要通用转换,而不是特定的自定义对象(在您的帖子中不完全清楚?),您可以试试这个:

$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"
  }
}

【讨论】:

  • 我正在寻找一个特定对象的类似输出。
  • 我正在尝试:foreach ($assoc as $to_obj) { $this->assoc[] = new Obj($to_obj); } 但我为 foreach 提供的参数无效
  • array_map 被认为是“巫毒”?
【解决方案2】:

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

$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); }
  • 你真的,真的,不需要为此上课。 PHP 已经有两种类型的数组:一种内置数组和 SPL“固定”数组。如果您需要哈希表语义,请使用第一个,如果您需要固定大小的数组,请使用第二个。 不要创建自己的包装器。
【解决方案3】:
$len = count($assoc);
for($i=0;$i<$len; $i++){
    $assoc[$i] = (Object)$assoc[$i];
}

【讨论】:

    【解决方案4】:

    您有一个关联数组的索引数组。如果将其转换为 json,然后返回到具有默认行为 json_decode() 的可迭代状态,则顶级(索引数组)将被转换为数组类型,而子数组将成为对象类型。

    请注意,这种转换将贯穿随后的数据级别(以防研究人员可能拥有更深层次的数据结构)。实际上,索引数组仍然是索引数组,而关联数组成为对象。

    这是一个非常基本的调用,我不确定是否有必要为其创建包装器。

    代码:(Demo)

    $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',
      ),
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多