Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php迭代器-如何保存从第二到最后的所有元素_Php_Iterator_Spl_Recursive Datastructures - Fatal编程技术网

php迭代器-如何保存从第二到最后的所有元素

php迭代器-如何保存从第二到最后的所有元素,php,iterator,spl,recursive-datastructures,Php,Iterator,Spl,Recursive Datastructures,我不知所措。我在谷歌上搜索了好几个小时,阅读了php手册,但我想不出一个解决方案 我得到了以下数组结构: [x] => Array ( ... [object_name_1] => Array ( [db] => x [form] => y

我不知所措。我在谷歌上搜索了好几个小时,阅读了php手册,但我想不出一个解决方案

我得到了以下数组结构:

[x] => Array
    (
        ...
                  [object_name_1] => Array
                      (
                          [db] => x
                          [form] => y
                          [value] => z
                      )

                  ...

                  [object_name_4] => Array
                      (
                          [db] => x
                          [form] => y
                          [value] => z
                      )
                  ...

                  [object_name_n] => Array
                      (
                          [db] => x
                          [form] => y
                          [value] => z
                      )
...
[y] => Array
    (
        ...
        [object_group_xyz] => Array
           (
                  [object_name_a] => Array
                      (
                          [db] => x
                          [form] => y
                          [value] => z
                      )

                  ...
           )
                  ...

                  [object_name_e] => Array
                      (
                          [db] => x
                          [form] => y
                          [value] => z
                      )
                  ...

                  [object_name_z] => Array
                      (
                          [db] => x
                          [form] => y
                          [value] => z
                      )
现在我的问题是: 我想保存所有对象名称数组。 数组的深度未知,事实上,不同对象的深度可以依赖于同一数组。但它们永远是最后一片叶子

我怎样才能解决这个问题。 据我所知,递归方法不能只考虑第二个到最后一个对象。

我的输出应该如下所示:

Array
(
    [object_name_1] => Array
        (
            [db] => x
            [form] => y
            [value] => z
        )
        ...
    [object_name_4] => Array
        (
            [db] => x
            [form] => y
            [value] => z
        )
        ...
    [object_name_n] => Array
        (
            [db] => x
            [form] => y
            [value] => z
        )
        ...
    [object_name_a] => Array
        (
            [db] => x
            [form] => y
            [value] => z
        )
        ...
    [object_name_e] => Array
        (
            [db] => x
            [form] => y
            [value] => z
        )
        ...
    [object_name_z] => Array
        (
            [db] => x
            [form] => y
            [value] => z
        )
        ...
)
谢谢你的时间和帮助

然后像这样使用:

在你的情况下,你会:

$array = array(

  0 => array(

    0 => (object) array('name' => 'a'),

    1 => (object) array('name' => 'b'),

    2 => (object) array('name' => 'c'),

  ),

  1 => array(

    3 => (object) array('name' => 'd'),

    4 => (object) array('name' => 'e'),

    5 => (object) array('name' => 'f'),

  ),

);

$objects = array();

foreach ($array as $a)
{

  end($a);

  $prev = prev($a);

  $objects[key($a)] = $prev;

}

echo '<pre>' . print_r($objects, TRUE) . '</pre>';

它不是迭代器类的内置功能,但您仍然可以使用
递归迭代器
并构建一个堆栈,在该堆栈中,您可以在到达某个叶时立即返回一步

以下内容更像是一种PoC,它不是一种超级清洁的解决方案,但它可以工作,并应证明其原理:

例子 示例输出

这根本不起作用。我有几个东西。您的解决方案除了打印单个叶的第二个到最后一个键外,什么都不做。我甚至无法使用您的解决方案获取对象名称1和对象名称2。我最初的问题有什么不清楚的吗?你说你想要倒数第二个元素。。。也许你问题中的一些输入和输出示例会让问题更清楚。我说过,我想要数组树中倒数第二个对象。示例输入和输出都在问题中,如果您愿意的话(只需考虑一个没有点的扁平阵列)是倒数第二个对象,而不是倒数第二个对象。我将添加一个示例输出,等等。你是说你有一个对象数组?请参阅我的编辑。
代表无效的数组结构。谢谢!工作起来很有魅力。
$array = array(

  0 => array(

    0 => (object) array('name' => 'a'),

    1 => (object) array('name' => 'b'),

    2 => (object) array('name' => 'c'),

  ),

  1 => array(

    3 => (object) array('name' => 'd'),

    4 => (object) array('name' => 'e'),

    5 => (object) array('name' => 'f'),

  ),

);

$objects = array();

foreach ($array as $a)
{

  end($a);

  $prev = prev($a);

  $objects[key($a)] = $prev;

}

echo '<pre>' . print_r($objects, TRUE) . '</pre>';
Array
(
    [1] => stdClass Object
        (
            [name] => b
        )

    [4] => stdClass Object
        (
            [name] => e
        )

)
class MyIterator extends RecursiveIteratorIterator {
  protected $stack = array();
  protected $result = array();

  public function __construct($data)
  {
    parent::__construct(new RecursiveArrayIterator($data), RecursiveIteratorIterator::SELF_FIRST);
  }
  public function getObjects()
  {
    foreach($this as $dummy);
    return $this->result;
  }

  public function rewind()
  {
    parent::rewind();
    $this->stack = array();
    $this->result = array();
    $this->pushIfNoLeaf();
  }
  public function next()
  {
    parent::next();
    $this->pushIfNoLeaf();
  }
  public function beginIteration()
  {
    parent::beginIteration();
    $this->popIfLeaf();
  }
  public function beginChildren()
  {
    parent::beginChildren();
    $this->popIfLeaf();
  }
  protected function pushIfNoLeaf()
  {
    if ($this->getSubIterator()->hasChildren()) {
      $this->stack[] = array('key' => $this->key(), 'value' => $this->current());
    }
  }
  protected function popIfLeaf()
  {
    if (!$this->getSubIterator()->hasChildren()) {
      $item = array_pop($this->stack);
      $this->result[$item['key']] = $item['value'];
    }
  }
}
$data = array(
'obj1' => array(1,2,3),
'arr1' => array(
  'obj2' => array(4,5,6),
  'obj3' => array(7,8,9)
)
);

$iterator = new MyIterator($data);
var_dump($iterator->getObjects());
array(3) {
  ["obj1"]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
  ["obj2"]=>
  array(3) {
    [0]=>
    int(4)
    [1]=>
    int(5)
    [2]=>
    int(6)
  }
  ["obj3"]=>
  array(3) {
    [0]=>
    int(7)
    [1]=>
    int(8)
    [2]=>
    int(9)
  }
}