SPL 函数

目录

添加备注

用户贡献的备注 8 个备注

ville</.>witt</a>gmail</.>com
18 年前
这两个函数的输出完全相同,唯一的区别是它们使用的目录迭代器。我希望那里的人可以利用它。
<?php
function listfilesin1 ($dir = ".", $depth=0) {
echo
"Dir: ".$dir."<br/>";
foreach(new
DirectoryIterator($dir) as $file) {
if (!
$file->isDot()) {
if (
$file->isDir()) {
$newdir = $file->getPathname();
listfilesin1($newdir, $depth+1);
} else {
echo
"($depth)".$file->getPathname() . "<br/>";
}
}
}
}
function
listfilesin2 ($dir = ".", $depth=0) {
echo
"Dir: ".$dir."<br/>";
foreach(new
RecursiveDirectoryIterator($dir) as $file) {
if (
$file->hasChildren(false)) {
$newdir = $file->key();
listfilesin2($newdir, $depth+1);
} else {
echo
"($depth)".$file->key() . "<br/>";
}
}
}
listfilesin();
?>
loaded67 at hotmail dot com
16 年前
对于某些应用程序,我需要反转一些标准迭代器。

所以,我模拟了这个灵活的函数。
享受

<?php
function reverse_iterator(Iterator $iterator){
$type = get_class($iterator);
$array = array_reverse(iterator_to_array($iterator), true);
return new
$type($array);
}
?>
semperluc (at) yahoo._forgot_the_rest
17 年前
<?php
/*
如何存储 SPL 迭代器结果(而不仅仅是回显并忘记):

迭代器库是基于对象的,因此你需要欺骗这些小坏蛋成为一个数组。
以下是如何(两种方法)...

1. 显式类型转换:$a[] = (array)$Obj->objMethod();

2. 数组定义:$a[] = array( key => $Obj->objMethod() );

示例:DirectoryIterator()
*/

// 1. 显式将对象类型转换为数组
foreach ( new DirectoryIterator('./') as $Item )
{
$fname = (array)$Item->getFilename();
$dir_listing[] = $fname[0];
}

//
echo "<pre>";
print_r($dir_listing); unset($dir_listing);
echo
"</pre><hr />";
//

// 或者

// 2. 定义数组为 key => object->method
foreach ( new DirectoryIterator('./') as $Item )
{
$dir_listing[] = array (
"fname" => $Item->getFilename(),
"path" => $Item->getPathname(),
"size" => $Item->getSize(),
"mtime" => $Item->getMTime()
);
}

//
echo "<pre>";
print_r($dir_listing); unset($dir_listing);
echo
"</pre>";
//
?>
benny at whitewashing dot de
16 年前
我必须纠正我之前实现的内容。之前的示例只支持正确的读访问,但在创建 ArrayMultiObject 后无法设置新值。此外,我必须纠正一个从我的复制粘贴更改到注释文本区域中出现的错误。

此代码片段现在希望实现一个完全功能的多维数组,由 ArrayObject 表示。

<?php
class ArrayMultiObject extends ArrayObject
{
function
__construct($array, $flags = 0, $iterator_class = "ArrayIterator")
{
$objects = array();
foreach(
$array AS $key => $value) {
if(
is_array($value)) {
$objects[$key] = new ArrayMultiObject($value, $flags, $iterator_class);
} else {
$objects[$key] = $value;
}
}

parent::__construct($objects, $flags, $iterator_class);
}

public function
offsetSet($name, $value)
{
if(
is_array($value)) {
$value = new ArrayMultiObject($value);
}

return
parent::offsetSet($name, $value);
}
}
?>
helly at php dot net
18 年前
有一个递归过滤器迭代器可以使上面的代码更容易。 然后还有一个 ParentIterator,它已经是一个递归过滤器迭代器,只接受具有子元素的元素,使用 RecursiveDirectoryIterator 作为内部迭代器,您显然只获得目录。 此外,它确保创建正确的子元素。 总之,您只需要执行以下操作

$it = new RecursiveDirectoryIterator($path);
$it = new ParentIterator($it);
$it = new RecursiveIteratorIteator($it);

foreach($it as $dir => $o) { ... }
phil &ampersat; flatnet.net
20 年前
这是一个 RecursiveDirectoryIterator 类实现示例。 它打印给定目录的简单树状视图
<?php
function recurse($it) {
echo
'<ul>';
for( ;
$it->valid(); $it->next()) {
if(
$it->isDir() && !$it->isDot()) {
printf('<li class="dir">%s</li>', $it->current());
if(
$it->hasChildren()) {
$bleh = $it->getChildren();
echo
'<ul>' . recurse($bleh) . '</ul>';
}
} elseif(
$it->isFile()) {
echo
'<li class="file">'. $it->current() . ' (' . $it->getSize(). ' Bytes)</li>';
}
}
echo
'</ul>';
}

recurse(new RecursiveDirectoryIterator('D:/'));
?>
adove at booyahnetworks dot com
18 年前
需要注意的是,至少对我来说,这一点非常重要,在文档中并不完全清楚,即 ArrayObject 类支持对一维键的 get/set 操作,以及对 *传递* 多维键/路径的 get 操作(参见下面的源代码)。 如果你和我一样,需要支持对多维数据的数组访问重载,你需要从 ArrayObject 派生并覆盖 ArrayAccess 接口方法来“遍历”传递的数据并将嵌入式数组转换为某种对象...

引用 Bug 34816 @ http://bugs.php.net/bug.php?id=34816.

问题的说明

$a = array(
"test" => array(
"one" => "dunno",
"two" => array(
"peekabo" => "do you see me?",
"anyone" => array("there")
)
)
);
$oArray = new ArrayObject($a);
var_dump($oArray);

$oArray["three"] = "No problems here.";

echo "\n\\test\\one == " . $oArray["test"]["one"] . "\n\n";

// 以下两者都不起作用!
$oArray["test"]["one"] = "Yes I do!";
$oArray["test"]["yes"] = array(
"hello" => "Goodbye!"
);

var_dump($oArray);

---
来自扩展作者的说明
实际上,有 RecursiveArrayObject 和 RecursiveArrayIterator 来处理递归结构。 但是,这并不总是像预期的那样解决所有多维问题。
prometheus - csaba dot dobai at php-sparcle dot hu
16 年前
此代码是一个示例。 通过使用此类类,您可以有机会创建扩展其他类但具有扩展 ArrayObject 类的大部分功能的类(例如多重继承)

<?php

class foo
{
public
$foo = 'foo';
}
// class

class foobar extends foo implements ArrayAccess,IteratorAggregate,Countable
{
public function
offsetExists($offset)
{
$array = array(1, 2, 3, 4);
return
array_key_exists($offset, $array);
}

public function
offsetGet($offset)
{
$array = array(1, 2, 3, 4);
return
$array[$offset];
}

public function
offsetSet($offset, $value)
{
// 使“数组”变为只读
}

public function
offsetUnset($offset)
{
// 使“数组”变为只读
}

function
count()
{
$array = array(1, 2, 3, 4);
return
count($array);
}
// function

function getArray()
{
return array(
1, 2, 3, 4);
}
// function

function getIterator()
{
return new
ArrayIterator(array(1, 2, 3, 4));
}
// function

function __toString()
{
return
'String test';
}
// function
} // class

$foobar = new foobar();
print
$foobar[0].'<br/>';
print
$foobar->foo.'<br/>';
print
count($foobar).'<br/>';

foreach (
$foobar as $k=>$v)
{
print
$k.'=>'.$v.'<br/>';
}
// foreach

var_dump($foobar->getArray());

print
$foobar;

/* 生成的输出:
1
foo
4
0=>1
1=>2
2=>3
3=>4
array
0 => int 1
1 => int 2
2 => int 3
3 => int 4
String test
*/
?>

为了正确使用,您必须定义所有这些方法,除了 getArray()

浏览 SPL 的源代码,这将非常有帮助。

ps: 对我的英语感到抱歉
To Top