Удалить родительский элемент в ассоциативном массиве - PullRequest
3 голосов
/ 31 марта 2019

Проблема:

Я хочу удалить родительский элемент моего массива с условием.

Input

$myArray = array (
    0 =>
    array (
      'ulStatic' =>
      array (
        0 =>
        array (
          'day' => '2019-03-30 18:30:00',
          'id' => '7',
          'origin' => 'intentions',
        ),
      ),
      'ulDynamic' =>
      array (
        0 =>
        array (
          'day' => '2019-03-30 18:30:00',
          'id' => '5',
          'origin' => 'intentions',
        ),
      ),
      'ulCreatedDynamic' =>
      array (
      ),
    ),
    1 =>
    array (
      'ulStatic' =>
      array (
        0 =>
        array (
          'day' => '2019-03-31 09:30:00',
          'id' => '8',
          'origin' => 'intentions',
        ),
      ),
      'ulDynamic' =>
      array (
      ),
      'ulCreatedDynamic' =>
      array (
      ),
    ),
    2 =>
    array (
      'ulStatic' =>
      array (
      ),
      'ulDynamic' =>
      array (
      ),
      'ulCreatedDynamic' =>
      array (
        0 =>
        array (
          'day' => '2019-04-02 11:15:00',
          'id' => '275',
          'origin' => 'obseques',
        ),
        1 =>
        array (
          'day' => '2019-04-02 11:15:00',
          'id' => '277',
          'origin' => 'obseques',
        ),
      ),
    ),
  );

В этом массиве я хочу удалить в ассоциативном массиве с именем ulCreatedDynamic ключ, содержащий id = 275 и day = '2019-04-02 11:15:00';

Итак, этот ключ нужно удалить:

0 =>
    array (
      'day' => '2019-04-02 11:15:00',
      'id' => '275',
      'origin' => 'obseques',
    ),

Попытка:

$id = 275;
$day = "2019-04-02 11:15:00";

foreach($myArray as $array):
    foreach($array as $ul => $v):
        if($ul == "ulCreatedDynamic"):
            foreach($v as $elementKey => $element):
                if($element['day'] == $day && $element['id'] == $id):
                    unset($v[$elementKey]);
                endif;
            endforeach;
        endif;
    endforeach;
endforeach;

Как мне решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 31 марта 2019

foreach($some_array as $item) скопирует весь массив на лету, как только любой элемент будет изменен. Вам нужно работать со ссылкой, используя вместо этого оператор &.

foreach($myArray as &$array):
  foreach($array as $ul => &$v):
0 голосов
/ 31 марта 2019

Я не совсем уверен, что это то, чего вы можете достичь.Я уверен, что есть гораздо более простые способы решить вашу проблему.

Возможно, вы не удаляете из своего основного массива $myArray в этой строке: unset($v[$elementKey]);

$myArray = array(
    0 => array(
        'ulStatic' => array(
            0 => array(
                'day' => '2019-03-30 18:30:00',
                'id' => '7',
                'origin' => 'intentions',
            ),
        ),
        'ulDynamic' => array(
            0 => array(
                'day' => '2019-03-30 18:30:00',
                'id' => '5',
                'origin' => 'intentions',
            ),
        ),
        'ulCreatedDynamic' => array(
        ),
    ),
    1 => array(
        'ulStatic' => array(
            0 => array(
                'day' => '2019-03-31 09:30:00',
                'id' => '8',
                'origin' => 'intentions',
            ),
        ),
        'ulDynamic' => array(
        ),
        'ulCreatedDynamic' => array(
        ),
    ),
    2 => array(
        'ulStatic' => array(
        ),
        'ulDynamic' => array(
        ),
        'ulCreatedDynamic' => array(
            0 => array(
                'day' => '2019-04-02 11:15:00',
                'id' => '275',
                'origin' => 'obseques',
            ),
            1 => array(
                'day' => '2019-04-02 11:15:00',
                'id' => '277',
                'origin' => 'obseques',
            ),
        ),
    ),
);

$id = 275;
$day = "2019-04-02 11:15:00";

foreach ($myArray as $k => $array):
    foreach ($array as $ul => $v):
        if ($ul == "ulCreatedDynamic"):
            foreach ($v as $elementKey => $element):
                if ($element['day'] == $day && $element['id'] == $id):
                    // unset($v[$elementKey]);
                    unset($myArray[$k][$ul][$elementKey]);
                endif;
            endforeach;
        endif;
    endforeach;
endforeach;
var_dump($myArray);

$ myArray:

array(3) {
  [0]=>
  array(3) {
    ["ulStatic"]=>
    array(1) {
      [0]=>
      array(3) {
        ["day"]=>
        string(19) "2019-03-30 18:30:00"
        ["id"]=>
        string(1) "7"
        ["origin"]=>
        string(10) "intentions"
      }
    }
    ["ulDynamic"]=>
    array(1) {
      [0]=>
      array(3) {
        ["day"]=>
        string(19) "2019-03-30 18:30:00"
        ["id"]=>
        string(1) "5"
        ["origin"]=>
        string(10) "intentions"
      }
    }
    ["ulCreatedDynamic"]=>
    array(0) {
    }
  }
  [1]=>
  array(3) {
    ["ulStatic"]=>
    array(1) {
      [0]=>
      array(3) {
        ["day"]=>
        string(19) "2019-03-31 09:30:00"
        ["id"]=>
        string(1) "8"
        ["origin"]=>
        string(10) "intentions"
      }
    }
    ["ulDynamic"]=>
    array(0) {
    }
    ["ulCreatedDynamic"]=>
    array(0) {
    }
  }
  [2]=>
  array(3) {
    ["ulStatic"]=>
    array(0) {
    }
    ["ulDynamic"]=>
    array(0) {
    }
    ["ulCreatedDynamic"]=>
    array(1) {
      [1]=>
      array(3) {
        ["day"]=>
        string(19) "2019-04-02 11:15:00"
        ["id"]=>
        string(3) "277"
        ["origin"]=>
        string(8) "obseques"
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...