在多维php对象中搜索

时间:2011-11-18 08:01:16

标签: php oop search

    public function filter($index, $value) {
        if($this->tasks) {
            foreach ($this->tasks as $id => $t) {
                if($t->$index != $value) {
                    unset($this->tasks[$id]);
                }
            }
        } else {
            echo "Tasks are empty";
        }
    }

所以我在搜索多维对象时遇到了问题。我的意思是这样的:

$task->form->id
$task->form->type
$task->author->id
$task->fields->[FIELDNAME]->value
$task->form->template->id
$task->id

等。这些是需要访问的字段类型。我认为我可以在$ index中输入“form-> id”,但这不起作用。对于我的应用程序,我几乎可以拼写出来。我只是不想为每个人写一个函数到最后,因为其中一些(你可以看到)只需要在第一级,有些需要一直到四个对象。

告诉我你需要什么更多数据,我会给它。我非常了解每次击键,所以有时候我忘了分享一些东西。

如果你有帮助,非常感谢你。

我的内容


好的,所以我让它上班但我做了不同的事情。

Form班级

public function search($value, $type = NULL) {
    if(is_object($this->fields)) {
        foreach($this->fields as $page) {
            foreach($page as $name=>$field) {
                if($name != "pdata") {
                    if ($type != NULL && $field->type == $type && $field->value == $value || $type == NULL && isset($field->value) && $field->value == $value) {
                        return true;
                    }
                } 
            }
            return false;
        }
    } else {
        //Probably corrupted
        return false;
    }
    return false;
}

除此之外我可以调用此函数并根据它是返回true还是false来删除或添加。

2 个答案:

答案 0 :(得分:2)

function array_searchRecursive( $needle, $haystack, $strict=false, $path=array() )
{
    if( !is_array($haystack) ) {
        return false;
    }

    foreach( $haystack as $key => $val ) {
        if( is_array($val) && $subPath = array_searchRecursive($needle, $val, $strict, $path) ) {
            $path = array_merge($path, array($key), $subPath);
            return $path;
        } elseif( (!$strict && $val == $needle) || ($strict && $val === $needle) ) {
            $path[] = $key;
            return $path;
        }
    }
    return false;
}

OR

我知道你不想全力以赴,但我不得不说我喜欢在Symfony框架中完成它的方式。在symfony中,您有一个Entity类,它定义了从给定对象中检索每条信息(变量)的函数。

您可以模仿这种方法的一种方法是为具有检索所需变量的函数的任务创建基类...例如getTaskId。

然后,您可以使用您正在使用的基类来扩展此基类。这将使您可以访问为解析对象而创建的函数。检索$ task-> form-> template-> id可以像调用getTemplateId函数一样简单。

我知道这可能比你想要的时间更长,但我希望它有所帮助。

答案 1 :(得分:1)

您可以使用get_object_vars()处理对象的所有公共变量,并递归地继续访问名为id的所有变量。这是一个简单的模板:

class Task {
    public $author, $form, $id;
}
class Author {
    public $id;
}
class Form {
    public $id, $type, $template;
}
class Template {
    public $id;
}

$tasks = Array();

$task = new Task();
$tasks[] = $task;
$task->id = "id1";
$task->author = new Author();
$task->author->id = "id1";
$task->form = new Form();
$task->form->template = new Template();
$task->form->template->id = "id1";

function filter($parent, $object, $id_value) {
    $vars = get_object_vars($object);
    foreach ($vars as $var => $value) {
        if ($var == "id") {
            if ($value == $id_value) {
                echo "$parent -> $var == $value <br />";
            }
        }
        else if (is_object($value) && isset($value)) {
            filter("$parent -> $var", $value, $id_value);
        }
    }
}

foreach ($tasks as $index => $task) {
    filter("Task[$index]", $task, "id1");
}

输出结果为:

Task[0] -> author -> id == id1 
Task[0] -> form -> template -> id == id1 
Task[0] -> id == id1