【问题标题】:How to get a specific value using RecursiveIteratorIterator如何使用 RecursiveIteratorIterator 获取特定值
【发布时间】:2017-05-12 00:19:02
【问题描述】:

我想使用 RecursiveIteratorIterator 获取多维数组的特定值

如果可能的话,我想像正常循环一样得到它

$val['key'];

我的代码

$data = array(
    'title' =>'how to work',
    'posts' => array(
        array(
            'title' => 'introduction to iterators',
            'email' => 'kingahmadz@hotmail.com'
        ),
        array(
            'title' => 'introduction to iterators2',
            'email' => 'kingahmadz@hotmail.com'
        ),
        array(
            'title' => 'introduction to iterators3',
            'email' => 'kingahmadz@hotmail.com'
        ),
    ));


foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($data)) as $item => $val) {
  echo $val['email'];
}

【问题讨论】:

  • 那么当您以这种方式展平数组并执行$val['title'];$val['email']; 时,您希望它显示什么?您有多个具有相同索引的数组值。

标签: php arrays iterator


【解决方案1】:

实际上,对于这种简单的情况,使用RecursiveIteratorIterator 对象会过于复杂且非最佳。
如果只是用于测试,请使用以下方法:

$key = 'email';
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($data), \RecursiveIteratorIterator::CATCH_GET_CHILD);
$emails = array_column($it->getInnerIterator()['posts'], $key);

print_r($emails);

输出:

Array
(
    [0] => kingahmadz@hotmail.com
    [1] => kingahmadz@hotmail.com
    [2] => kingahmadz@hotmail.com
)

不使用迭代器并立即应用array_column 函数来获得相同的结果更简单:

$emails = array_column($data['posts'], $key);

【讨论】:

    【解决方案2】:

    在您的示例中,$item 是键,$val 是值。如果你想输出一个特定的键,那么你可以执行以下操作:

    foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($data)) as $item => $val) {
        if ($item == 'email') {
            echo $val . '<br />';
        }
    }
    

    【讨论】:

      【解决方案3】:

      您好,您能解释一下为什么需要使用 RecursiveIteratorIterator 因为在您的示例中,您可以使用 array_column 来获取电子邮件

      array_column($data['posts'], 'email')
      

      【讨论】:

        【解决方案4】:

        如果您只需要获取所有电子邮件,您应该使用array_column

        $posts = $data['posts'];
        
        foreach (array_column($posts, 'email') as $email) {
            echo $email, PHP_EOL;
        }
        

        但是,如果您需要获取所有电子邮件值(无论深度如何),您有多种选择

        使用简单的RecursiveIteratorIterator:

        $iterator = new RecursiveIteratorIterator(
            new RecursiveArrayIterator($data)
        );
        
        foreach ($iterator as $key => $value) {
            if ($key === 'email') {
                echo $value, PHP_EOL;
            }
        }
        

        使用RecursiveCallbackFilterIteratorRecursiveFilterIterator

        $iterator = new RecursiveIteratorIterator(
            new RecursiveCallbackFilterIterator(
                new RecursiveArrayIterator($data), 
                function ($_, $key, $iterator) {
                    if($iterator->hasChildren()) {
                        return true;
                    }
        
                    return $key === 'email'; 
                }
            )
        );
        
        foreach ($iterator as $email) {
            echo $email, PHP_EOL;
        }
        

        使用RecursiveRegexIterator:

        $iterator = new RecursiveIteratorIterator(
            new RecursiveRegexIterator(
                new RecursiveArrayIterator($data),
                '/^email$/',
                RegexIterator::MATCH,
                RegexIterator::USE_KEY
            )
        );
        
        foreach ($iterator as $email) {
            echo $email, PHP_EOL;   
        }
        

        这里是working demo

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-13
          • 2021-12-20
          • 1970-01-01
          • 2021-04-21
          • 2021-11-28
          相关资源
          最近更新 更多