duankang5882 2019-03-26 23:30
浏览 354

用foreach更改对象的数组值

i want create an array of object like this:

[

    'A' => { 'name':'name1', 'family':'family1'},

    'B' => { 'name':'name2', 'family':'family2'},

    'C' => { 'name':'name3', 'family':'family3'},

    'D' => { 'name':'name4', 'family':'family4'},

    'E' => { 'name':'name5', 'family':'family5'},

    'F' => { 'name':'name6', 'family':'family6'},

];

i have an array contine name and other array contine family, so i use foreach loop. but result is a Amazing. why loop in each, change all names and all family?

$name    = [
    'A'=>'name1',
    'B'=>'name2',
    'C'=>'name3',
    'D'=>'name4',
    'E'=>'name5',
    'F'=>'name6'
];
$family  = [
    'A'=>'family1',
    'B'=>'family2',
    'C'=>'family3',
    'D'=>'family4',
    'E'=>'family5',
    'F'=>'family6'
];
$key     = array_keys( $name );
$myArray = array_fill_keys( $key, new stdClass() );

foreach( $myArray as $k => $info ){
    $myArray[$k]->name = $name[$k];
    $myArray[$k]->family = $family[$k];
}

and this is a result

[

    'A' => { 'name':'name6', 'family':'family6'},

    'B' => { 'name':'name6', 'family':'family6'},

    'C' => { 'name':'name6', 'family':'family6'},

    'D' => { 'name':'name6', 'family':'family6'},

    'E' => { 'name':'name6', 'family':'family6'},

    'F' => { 'name':'name6', 'family':'family6'},

];
  • 写回答

2条回答 默认 最新

  • dongyi1490 2019-03-26 23:34
    关注

    This would be simpler

    $name    = [
        'A'=>'name1',
        'B'=>'name2',
        'C'=>'name3',
        'D'=>'name4',
        'E'=>'name5',
        'F'=>'name6'
    ];
    $family  = [
        'A'=>'family1',
        'B'=>'family2',
        'C'=>'family3',
        'D'=>'family4',
        'E'=>'family5',
        'F'=>'family6'
    ];
    
    foreach( $name as $k => $info ){
        $t = new stdClass();
        $t->name = $info;
        $t->family = $family[$k];
        $myArray[$k] = $t;
    }
    

    RESULT

    Array
    (
        [A] => stdClass Object
            (
                [name] => name1
                [family] => family1
            )
        [B] => stdClass Object
            (
                [name] => name2
                [family] => family2
            )
        [C] => stdClass Object
            (
                [name] => name3
                [family] => family3
            )
        [D] => stdClass Object
            (
                [name] => name4
                [family] => family4
            )
        [E] => stdClass Object
            (
                [name] => name5
                [family] => family5
            )
        [F] => stdClass Object
            (
                [name] => name6
                [family] => family6
            )
    )
    

    Then if you do a json_encode() on that you get what you want

    echo json_encode($myArray);
    
    {
        "A": {
            "name": "name1",
            "family": "family1"
        },
        "B": {
            "name": "name2",
            "family": "family2"
        },
        "C": {
            "name": "name3",
            "family": "family3"
        },
        "D": {
            "name": "name4",
            "family": "family4"
        },
        "E": {
            "name": "name5",
            "family": "family5"
        },
        "F": {
            "name": "name6",
            "family": "family6"
        }
    }
    

    UPDATE: Why you had a problem with your code

    This line

    $myArray = array_fill_keys( $key, new stdClass() );
    

    is filling an array with a reference to a single object.

    Therefore when you load data into the object in the array you are filling a single object with some data. That object is referenced (pointed to) in all your array occurances. So you only see data loaded in the last iteration of the loop in all the array occurances.

    A simple test for example

    $name    = [
    'A'=>'name1',
    'B'=>'name2',
    'C'=>'name3',
    'D'=>'name4',
    'E'=>'name5',
    'F'=>'name6'
    ];
    $family  = [
        'A'=>'family1',
        'B'=>'family2',
        'C'=>'family3',
        'D'=>'family4',
        'E'=>'family5',
        'F'=>'family6'
    ];
    
    $key     = array_keys( $name );
    $myArray = array_fill_keys( $key, new stdClass() );
    
    // looks like it should fill only the object in the first 'A' occurance
    $myArray['A']->one = 1;
    print_r($myArray);
    

    RESULT

    Array
    (
        [A] => stdClass Object ( [one] => 1 )
        [B] => stdClass Object ( [one] => 1 )
        [C] => stdClass Object ( [one] => 1 )
        [D] => stdClass Object ( [one] => 1 )
        [E] => stdClass Object ( [one] => 1 )
        [F] => stdClass Object ( [one] => 1 )
    )
    
    评论

报告相同问题?

悬赏问题

  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教