2011-11-18 112 views
0
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"; 
     } 
    } 

所以我遇到了上面搜索多维对象的函数有问题。我的意思是这样的:在多维的php对象中搜索

$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
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函数一样简单。

我知道这可能需要比您所寻找的更长的时间,但我希望它可以帮助。

+0

此外,它似乎有在$任务 - >表单级别内的多个变量。在这种情况下,不必编写函数来检索每个函数,只需编写一个函数来检索整个“表单”对象。 – Shattuck

+0

是的,这似乎需要很长的时间,而时间不是我拥有的。我希望它看起来像一个简单的数组递归搜索。我只是不知道如何实现递归,你认为这会起作用,还是我完全错了。 –

+0

哦是的,有很多很多变量可以被搜索。它最终成为相当大量的数据。 –

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 
+0

我真的认为这是一个很酷的想法,但我最终做了别的事情。谢谢你的努力。 –