Как подтолкнуть повторяющуюся запись в PHP? - PullRequest
0 голосов
/ 03 января 2019

Ниже приведен объект:

$obj = (object) [];
$obj->{'key1'} = 'val1';

Теперь, как мне нажать клавишу с тем же именем, но другим значением?

$obj = (object) [];
$obj->{'key1'} = 'val1';
$obj->{'key1'} = 'val2';

Он просто редактирует key1.Я знаю, что это ожидаемое поведение, но у нас есть другие обходные пути?

Я хочу, чтобы схема была похожа на:

"collection": {
    "obj1": "val1",
    "obj1": "val2"
}

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Поведение объекта PHP по умолчанию, как и во многих других языках, заключается в том, что ключ должен быть уникальным.Если он существует, он будет обновлен.

Другого обходного пути нет, если только вы не хотите просто сделать это значение ключа массивом и добавить его, если вы установите значение для существующего ключа.

Например,

$obj = (object) [];
$obj->{'key1'} = 'val1';

Объект:

object(stdClass)#1 (1) { ["key1"]=> string(4) "val2" }


$obj = (object) [];
$obj->{'key1'} = array();
$obj->{'key1'}[] = 'val1';
$obj->{'key1'}[] = 'val2';

А теперь объект:

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

Исходя из того, что вы можете создать пользовательский объект, который делаетчто когда вы присваиваете значение существующему ключу:

class MyObj {
  private $data = array();
  public function __set($key, $val) {
    if (array_key_exists($key, $this->data)) {
      if (!is_array($this->data[$key])) {
        $this->data[$key] = array($this->data[$key], $val);
      } else {
        $this->data[$key][] = $val;
      }
    } else {
      $this->data[$key] = $val;
    }
  }
  public function __get($key) {
    if (array_key_exists($key, $this->data)) {
      return $this->data[$key];
    }
  }
}

Итак, теперь вы устанавливаете их так:

$obj = new MyObj();
$obj->key1 = 'val1';
$obj->key2 = 'val2';
$obj->key1 = 'val3';

И результат:

<code>echo '<pre>';
print_r($obj->key1);
echo '
';Массив ([0] => val1 [1] => val3)
0 голосов
/ 03 января 2019

Вы можете отобразить значения в массиве с ключом «key1» в качестве ключа:

$obj = (object) [];
$obj->key1 = ['val1', 'val2'];

Выход:

{#183 ▼
  +"key1": array:2 [▼
    0 => "val1"
    1 => "val2"
  ]
}

Теперь вы можете легко перемещатьсядля "key1" и получить все значения.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...