有人可以解释清楚的根本差异ArrayIterator,ArrayObject以及在阵列中的PHP的功能和操作方面?谢谢!
我怀疑我在这里做了些蠢事,但我对SPL的一个简单问题感到困惑:
如何使用RecursiveArrayIterator/RecursiveIteratorIterator修改数组的内容(本例中的值)?
使用以下测试代码,我可以使用getInnerIterator()和offsetSet()更改循环内的值,并在循环中转储已修改的数组.
但是当我离开循环并从迭代器转储数组时,它又回到了原始值.发生了什么?
$aNestedArray = array();
$aNestedArray[101] = range(100, 1000, 100);
$aNestedArray[201] = range(300, 25, -25);
$aNestedArray[301] = range(500, 0, -50);
$cArray = new ArrayObject($aNestedArray);
$cRecursiveIter = new RecursiveIteratorIterator(new RecursiveArrayIterator($cArray), RecursiveIteratorIterator::LEAVES_ONLY);
// Zero any array elements under 200
while ($cRecursiveIter->valid())
{
if ($cRecursiveIter->current() < 200)
{
$cInnerIter = $cRecursiveIter->getInnerIterator();
// $cInnerIter is a RecursiveArrayIterator
$cInnerIter->offsetSet($cInnerIter->key(), 0);
}
// This returns the modified array as expected, with elements progressively being zeroed
print_r($cRecursiveIter->getArrayCopy()); …Run Code Online (Sandbox Code Playgroud) 我知道如何检查数组中的值,但如何在Array Iterator中检查值?
$array = new ArrayIterator(array(
'1QmRjtsw2UQ' => array('pubdate' => '26 Jun 15', 'alt' => '8 Year Old Beautifully Covers Thinking Out Loud', 'anchor text' => '8-yo \'Thinking Out Loud\''),
'eKqLaYrcf3A' => array('pubdate' => '25 Jun 15', 'alt' => 'Plane Lands On Truck', 'anchor text' => 'Plane Lands On Truck'),
));
Run Code Online (Sandbox Code Playgroud)
我正在尝试检查诸如此类的值1QmRjtsw2UQ.
这不起作用:
if(in_array('1QmRjtsw2UQ', $array));
Run Code Online (Sandbox Code Playgroud) 我试图理解PHP中对象数组的概念.到目前为止,我只是使用常规数组循环遍历记录列表并在表格中显示它们.
我知道我可以使用Object做到这一点,但我不太清楚如何做到这一点.
我理解单个Object实例的概念,其中所有属性都表示从数据库填充的字段及其关联值,可以调用如下:
$objUser->first_name;
Run Code Online (Sandbox Code Playgroud)
现在我想了解的,根本找不到一个简单的答案是如何处理让我们说的用户列表,我想在一个页面上显示.我已经看到有ArrayObject,ArrayIterator等,但是根本无法理解它们是如何工作的,所以如果有人可以尝试用一些如何完成上述内容的例子来解释它,我将非常感激.
我正在寻找的是一个包含元素列表的对象,我可以像这样循环(如果可能的话):
foreach($objUsers as $objUser) {
echo $objUser->first_name;
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我在使用ArrayIterator时遇到了一些问题(实际上,与ArrayObject相同的问题).
对于99%的所有内容,我的扩展ArrayIterator表现得像一个阵列,并且运行良好.
不幸的是,implode()不喜欢被赋予ArrayIterator(或ArrayObject).
我无法在文档中找到任何建议通过扩展ArrayIterator实现任何其他类的文档,也没有任何其他方法可以覆盖.
任何人都可以建议如何使这个工作?(注意:每次使用implode时都要转换为数组不是解决方案,因为我希望这个类似数组的对象能够完全作为一个数组工作,并且不需要使用它来代码知道/关心/强制转换)
我有这段PHP代码:
echo 'PHP ' . phpversion()."\n";
$arr = array();
for ($i=0; $i<10; $i++)
{
$arr[] = new stdClass();
}
$it = new ArrayIterator($arr);
$i = 1;
foreach ($it as $obj)
{
$obj->test = $i;
$i++;
}
var_dump(current($it));
die();
Run Code Online (Sandbox Code Playgroud)
PHP 5.3 的输出如下:
PHP 5.3.8
object(stdClass)#805 (1) {
["test"]=>
int(1)
}
Run Code Online (Sandbox Code Playgroud)
PHP 7.4.8 上的输出如下:
PHP 7.4.8
file.php:33:boolean false
Run Code Online (Sandbox Code Playgroud)
为什么这不再起作用了?
我的代码中的数组非常大,所以我将它粘贴在pastebin中.http://pastebin.com/6tviT2Xj
我不明白为什么我会得到无限循环
这个脚本的逻辑是:
$it = new ArrayIterator($options);
while($it->valid()) {
print $it->key();
print $it->current();
}
Run Code Online (Sandbox Code Playgroud) 我试图克隆一个\ ArrayIterator对象,但似乎克隆的对象仍然引用原始对象.
$list = new \ArrayIterator;
$list->append('a');
$list->append('b');
$list2 = clone $list;
$list2->append('c');
$list2->append('d');
// below result prints '4', i am expecting result '2'
echo $list->count();
Run Code Online (Sandbox Code Playgroud)
有人解释过这种行为吗?先感谢您.
这是我的第一个项目libGDX,我正在尝试循环一个com.badlogic.gdx.utils.Array:
//properties
...
private Array<Item> items;
...
//constructor
...
items = new Array<Item>();
...
//render method
...
for (Item item : items) {
item.update(deltaTime);
}
...
Run Code Online (Sandbox Code Playgroud)
Android Studioitems在悬停时突出显示消息:
使用不可重入迭代器方法:Array.iterator()
每次调用该方法时,LibGDX 集合上的迭代器方法都会返回相同的迭代器实例。对于嵌套或多线程迭代,使用适当的构造函数创建一个新的迭代器
我不确定如何解决这个问题,或者这是否只是一种通知类型的错误,从长远来看它是否会影响任何事情。
任何想法这是什么以及如何解决它?
可能重复:
为什么使用迭代器而不是数组索引?
因为在我的生活中,我无法弄清楚它们是多么多余.
vector<string>::iterator iter1
vector<string>::const_iterator iter2
Run Code Online (Sandbox Code Playgroud)
也许他们更快?
arrayiterator ×10
php ×8
arrays ×3
arrayobject ×2
iterator ×2
android ×1
c++ ×1
clone ×1
foreach ×1
implode ×1
java ×1
libgdx ×1
reentrancy ×1
spl ×1