изменить значение массива объекта с помощью foreach - PullRequest
1 голос
/ 27 марта 2019

Я хочу создать массив объектов следующим образом:

[

    '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'},

];

У меня есть имя contine-массива и другое семейство contine-массивов, поэтому я использую цикл foreach. но результат удивительный. зачем в каждом цикле, менять все имена и всю семью?

$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];
}

и это результат

[

    '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 ]

0 голосов
/ 27 марта 2019

Обновите ваш цикл foreach, чтобы он выглядел примерно так:

foreach( $myArray as $k => $info ){
    $myArray[$k] = ['name' => $name[$k] , 'family' => $family[$k]];
}
0 голосов
/ 27 марта 2019

Это было бы проще

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

РЕЗУЛЬТАТ

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

Тогда, если вы выполните json_encode (), вы получите то, что хотите

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

ОБНОВЛЕНИЕ: Почему у вас были проблемы с вашим кодом

Эта строка

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

заполняет массив ссылкой на один объект.

Поэтому, когда вы загружаете данные в объект массива, вы заполняете один объект некоторыми данными. Этот объект ссылается (на него указывают) во всех ваших массивах. Таким образом, вы видите только данные, загруженные на последней итерации цикла, во всех вхождениях массива.

Простой тест, например

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

РЕЗУЛЬТАТ

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 )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...