【问题标题】:How to combine objects to array without removing duplicates in PHP如何在不删除 PHP 中的重复项的情况下将对象组合到数组中
【发布时间】:2016-02-05 16:21:41
【问题描述】:

我有 3 个对象,我希望它们组合成 1 个数组。对象中有重复的属性名称,但我也想要它们(重命名属性名称)。我该怎么做?

$object1 = {
    "id": "10",
    "unit_number": "12565"
},
$object2 = {
    "id": "20",
    "full_name": "Lorem Ipsm"
},
$object3 = {
    "id": "30",
    "phone": "123456789"
}

我想要这样的输出,

array = (
    "id1" => "10",
    "unit_number" => "12565",
    "id2" => "20",
    "full_name" => "Lorem Ipsm",
    "id3" => "30",
    "phone" => "123456789"
);

我试图将它们分配给一个数组,例如,

$arr = array();
$arr['obj1'] = $object1;
$arr['obj2'] = $object2;
$arr['obj3'] = $object3;

现在我想做一个 foreach,但我被卡住了。我的实际对象太大了。所以有很多重复。不只是这个。

【问题讨论】:

  • @AbraCadaver 是的。试图分配给一个数组并进行循环。但是卡住了。查看更新的问题。
  • id 是唯一被复制的元素吗??
  • 没有。它可能会动态变化:(我的实际对象太大了。
  • 如何采用一种理智的方法并制作一个 ids 的数组,而不是 id1id2 等?

标签: php arrays object merge


【解决方案1】:

我认为您可以使用以下代码实现此目的,

$object1 =  (object) ['id' => '10',  "unit_number"=> "12565", "name" => 'Test name'];

$object2 = (object) ['id' => '20',  "full_name"=> "Lorem Ipsm"];

$object3 = (object) ['id' => '30',  "phone"=> "123456789", "name" => "test name 1"];

$array1 = (array) $object1;
$array2 = (array) $object2;
$array3 = (array) $object3;

function array_merge_dup_keys() {
  $arrays = func_get_args();
  $data = array();
  foreach ($arrays as $a) {
    foreach ($a as $k => $v) {
      $key1 = check_key_exists($k,$data);   
      $data[$key1] = $v;
    }
  }
  return $data;
}

function check_key_exists($key,$array,$loop_count=1)
{  
    if(array_key_exists ( $key , $array ))
        {   
            $val = explode('_',$key);
            $count = isset($val[1]) ? $val[1] : $loop_count;
            $start_key = isset($val[0]) ? $val[0] : $key;
            $key = $start_key.'_'.$loop_count; 
            $key = check_key_exists($key,$array,$count+1);
        }
    return $key;
}

$data = array_merge_dup_keys($array1 ,$array2,$array3);

上述代码的输出($data)将是,

Array
(
    [id] => 10
    [unit_number] => 12565
    [name] => Test name
    [id_1] => 20
    [full_name] => Lorem Ipsm
    [id_2] => 30
    [phone] => 123456789
    [name_1] => test name 1
)

【讨论】:

    【解决方案2】:

    也许是这样的? (未经测试,可能的拼写错误/语法错误...)

    // this looks like json, not PHP
    // "object1": {
    //    "id": "10",
    //    "unit_number": "12565"
    // },
    // "object2": {
    //    "id": "20",
    //    "full_name": "Lorem Ipsm"
    // },
    // "object3": {
    //    "id": "30",
    //    "phone": "123456789"
    //  }
    
    // here is a php array for that data
    $objArray = array(
      "object1" => array( "id"=>"10", "unit_number"=>"12565"),
      "object2" => array( "id"=>"20", "full_name"=>"Lorem Ipsm"),
      "object3" => array( "id"=>"30", "phone"=>"123456789")
    );
    $newArray = array();
    foreach( $objArray as $key=>$value)
    {
      // the the id "append"
      $idAppend = substr($key, strlen("object"));
    
      foreach($value as $subkey=>$subvalue)
      {
        $newkey = $subkey;
        if ( strcmp($subkey, "id") == 0 ) // it is the id string
        {
          $newkey = $subkey.$idAppend;
        }
    
        $newArray[$newkey] = $subvalue;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 2014-06-15
      • 2013-07-27
      • 2018-07-22
      • 2018-09-10
      相关资源
      最近更新 更多