删除关联数组中的父元素

问题描述 投票:4回答:2

Problem:

我想用条件删除数组的父元素。

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 = 275day = '2019-04-02 11:15:00'的键;

所以这个键必须删除:

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

Attempt:

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

我该如何解决这个问题?

php arrays foreach
2个回答
2
投票

一旦更改任何项目,foreach($some_array as $item)将立即复制整个阵列。您需要使用&运算符来处理引用。

foreach($myArray as &$array):
  foreach($array as $ul => &$v):

0
投票

我不确定这是否是你想要实现的目标。我很确定有更简单的方法可以解决您的问题。

也许,你不是从你的主阵列$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"
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.