多维数组搜索以保留父级

时间:2012-07-04 07:44:14

标签: php arrays multidimensional-array filter vtiger

TL; DR

我有这些数据:var_exportprint_r

我需要将其缩小到:http://pastebin.com/EqwgpgAP($ data ['股票信息:'] [0] [0]);

如何实现它? (动态地)


我正在使用vTiger 5.4.0 CRM,我正在寻找一种能够根据搜索条件返回特定字段信息的函数。

嗯,vTiger是一个写得很弱的系统,外观和感觉都很旧,一切都来自数百个具有多个连接的表(实际上并没有那么糟糕)等等,但是工作就是工作。

需要从产品模块,股票信息块中获取usageunit选项列表。

由于没有getField();这样的功能,我期待从Blocks中过滤出来,实际上也是收集有关字段的信息。

getBlocks();然后调用接近getFields();的内容,再次接近getValues();,等等。

因此...

$focus = new $currentModule(); // Products
$displayView = getView($focus->mode);
$productsBlocks = getBlocks($currentModule, $displayView, $focus->mode, $focus->column_fields); // in theory, $focus->column_fields should/could be narrowed down to my specific field, but vTiger doesn't work that way

echo "<pre>"; print_r($productsBlocks); echo "</pre>"; // = http://pastebin.com/3iTDUUgw (huge dump)

正如您所看到的,[Stock Information:][0][0]下的翻译(yada,yada ...)实际上出现的键usageunit下的数组包含array_filter();的信息。< / p>

现在,我尝试$productsBlocks从那里获取数据,但只有我设法获得的内容是[Stock Information:]被剥离为仅包含$getUsageUnit = function($value) use (&$getUsageUnit) { if(is_array($value)) return array_filter($value, $getUsageUnit); if($value == 'usageunit') return true; }; $productsUsageUnit = array_filter($productsBlocks, $getUsageUnit); echo "<pre>"; print_r($productsUsageUnit); echo "</pre>"; // = http://pastebin.com/LU6VRC4h (not that huge of a dump) 所有数据:

print_r($productsUsageUnit['Stock Information:'][0][0]);

而且,我期待的结果是http://pastebin.com/EqwgpgAP,我是{{1}}手动获取的。


我如何实现这一目标? (动态...)

1 个答案:

答案 0 :(得分:2)

function helper($data, $query) {
  $result = array();

  $search = function ($data, &$stack) use(&$search, $query) {
    foreach ($data as $entry) {
      if (is_array($entry) && $search($entry, $stack) || $entry === $query) {
        $stack[] = $entry;
        return true;
      }
    }

    return false;
  };


  foreach ($data as $sub) {
    $parentStack = array();
    if ($search($sub, $parentStack)) {
      $result[] = $parentStack[sizeof($parentStack) - 2];
    }
  }

  return $result;
}

$node = helper($data, 'usageunit');
print_r($node);