1

TL;DR

私はこのデータを持っています:var_exportprint_r

そして、次のように絞り込む必要があります: http://pastebin.com/EqwgpgAP ($data['株式情報:'][0][0]);

どうすればそれを達成できますか?(動的に)


私は vTiger 5.4.0 CRM を使用しており、検索条件に基づいて特定のフィールド情報を返す関数を実装しようとしています。

まあ、vTiger はかなり貧弱に書かれたシステムで、見た目も感じも古く、すべてが複数の結合を持つ何百ものテーブルから出てきます (実際にはそれほど悪くはありません) などですが、仕事は仕事です。

usageunitこの必要性は、製品モジュール、株式情報ブロックから選択リストを取得することから生じました。

のような機能はないのでgetField();、実際にフィールドに関する情報も収集しているブロックから除外することを楽しみにしています。

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:]実際には翻訳 (yada、yada...) から得られるkey の下の配列には、 の[0][0]情報が含まれていますusageunit

今、私はarray_filter();そこからデータを取得しようとしていましたが、取得できたのは、すべてのデータ$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)

そして、私が楽しみにしている結果は、手動で取得したhttp://pastebin.com/EqwgpgAPprint_r($productsUsageUnit['Stock Information:'][0][0]);です。


どうすればこれを達成できますか? (動的に...)

4

1 に答える 1

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);
于 2012-07-04T08:14:38.727 に答える