【问题标题】:Using PHP array iterator to edit array使用 PHP 数组迭代器编辑数组
【发布时间】:2015-11-29 22:09:52
【问题描述】:

我有一个多维数组,其中包含可变数量的数据级别。也就是说,我无法确定达到Goal 级别需要多少次迭代,这是一个数组。像这样的:

[ 
    'key1' = 'value1',
    'key2' = 'value2',
    'key3' = [
        'key4' => [
            'key5' => 'value3'
            ],
        'key6' => 'value4'
    ],
    'key7' => [
        'Goal' => [
            'value5',
            'value6',
            'value7'
        ]
    ],
    'key8' => 'value8'],
    'key9' => [
        'Goal' => [
            'value9',
            'Foo',
            'value10'
        ]
    ]
]

array_walk_recursiveArrayIterator 我都试过了,但似乎都没有让我到达我需要的地方。

我需要遍历数组的每个元素,如果键是Goal,请检查值(例如Goal 保存的数组)并查看该数组是否包含值Foo

如果在数组中找到Foo,我需要在数组中添加一个新值(除了Foo--所以称它为Bar)然后继续,因为可能还有更多@987654332 @ 在父数组中。

当我们找到Goal 时,有没有办法“停止”迭代器,无需进一步迭代,然后执行array_search 操作?

编辑:尝试这些方面的东西--

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); 
foreach($iterator as $key => $value)
{
   if($key == 'Goal')
   {
       if (is_array($value)) {
           if(array_search('Foo', $value)) {
               $value[] = 'Bar';
           }
       }
   }
}

【问题讨论】:

  • 显示您当前拥有的代码,它至少可以清除您正在尝试做的事情
  • 这样的? eval.in/427733
  • @RobbieAverill -- 这几乎是需要的,但有两件事 -- 1) 数组中可以有多个 Goals,2) 我需要返回整个数组,其中Bar 添加,而不仅仅是 Goal 节点。谢谢,你让我离我更近了!

标签: php arrays iterator


【解决方案1】:

在我看来,在这类数组中使用迭代器会很奇怪......我会用这样的东西来做:

/*
    Usage:
            $wasFound = checkArray( "Goal", "Foo", $the_array);
            if ( $wasFound ) echo "Key and Value pair found in the array!";
            else { /* not found */ }
*/

function checkArray( $key_to_find, $value_to_find, $my_var, $last_key = NULL ) {
    $found = FALSE;

    if ( $last_key == $key_to_find && $my_var == $value_to_find )
        return TRUE;

    if ( $my_var == NULL )
        return FALSE;

    if ( is_array( $my_var ) ) {
        foreach ( $my_var AS $key => $value )
        {
            if ( $found ) {
                /* Do something else if needed when found */
                break;
            }

            $found = checkArray( $key_to_find, $value_to_find, $value, $key );
        }
    }

    return $found;
}

【讨论】:

    【解决方案2】:

    不完全确定这是否是您想要实现的目标,但这里有一个解决方案,它将 Bar 添加到嵌套在 Goal 键中的数组中:

    $array = [
        'key1' => 'value1',
        'key2' => 'value2',
        'key3' => [
            'key4' => [
                'key5' => 'value3',
            ],
            'key6' => 'value4',
        ],
        'key7' => [
            'Goal' => [
                'value5',
                'value6',
                'value7',
            ],
        ],
        'key8' => 'value8',
        'key9' => [
            'Goal' => [
                'value9',
                'Foo',
                'value10',
            ],
        ],
    ];
    
    function iterate(array $data, $goal = false)
    {
        foreach ($data as $key => &$value) {
            if (is_array($value)) {
                $value = iterate($value, $key === 'Goal');
    
            } elseif (is_string($value)) {
                if (($value === 'Foo') && $goal) {
                    $data[] = 'Bar';
                    return $data;
                }
            }
        }
    
        return $data;
    }
    
    var_export(iterate($array));
    

    代码生成以下输出:

    array (
      'key1' => 'value1',
      'key2' => 'value2',
      'key3' => 
      array (
        'key4' => 
        array (
          'key5' => 'value3',
        ),
        'key6' => 'value4',
      ),
      'key7' => 
      array (
        'Goal' => 
        array (
          0 => 'value5',
          1 => 'value6',
          2 => 'value7',
        ),
      ),
      'key8' => 'value8',
      'key9' => 
      array (
        'Goal' => 
        array (
          0 => 'value9',
          1 => 'Foo',
          2 => 'value10',
          3 => 'Bar',
        ),
      ),
    )
    

    【讨论】:

      【解决方案3】:

      我同意递归是执行此操作的方法。使用array_walk_recursive 的问题是您将看不到Goal 键,因为根据PHP documentation

      任何包含数组的键都不会传递给函数。

      我不确定使用RecursiveIteratorIterator 是否比仅仅为其编写递归函数更好。类似这样的函数应该相当简单。

      function addBar(&$array) {
          foreach ($array as $key => &$value) {
              if ($key === 'Goal') {
                  if(array_search('Foo', $value)) {
                      $value[] = 'Bar';
                  }
              } elseif (is_array($value)) {
                  addBar($value);
              }
          }
      }
      

      此函数引用您的数组,因此它将更新您的实际数组,而不是创建一个将Bar 添加到每个Goal 的副本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-13
        • 2017-11-03
        • 2012-11-29
        • 1970-01-01
        • 1970-01-01
        • 2014-06-25
        • 1970-01-01
        相关资源
        最近更新 更多