Búsqueda de matriz multidimensional para preservar el padre

TL; DR

Tengo estos datos: var_exportar y imprimir_r.

Y necesito reducirlo a: http://pastebin.com/EqwgpgAP ($datos['Información bursátil:'][0][0]);

¿Cómo se lograría? (dinamicamente)


Estoy trabajando con vTiger 5.4.0 CRM y estoy buscando implementar una función que devuelva una información de campo particular basada en criterios de búsqueda.

Bueno, vTiger es un sistema bastante débilmente escrito, se ve y se siente viejo, todo sale de cientos de tablas con múltiples uniones (eso en realidad no es tan malo), etc., pero el trabajo es el trabajo.

Surgió la necesidad de conseguir usageunit lista de selección del módulo Productos, bloque Información de stock.

Como no existe tal función como getField();, Espero filtrarlo de Bloques, que en realidad también recopila información sobre campos.

getBlocks(); luego llama a algo cercano a getFields();, que de nuevo algo cercano a getValues(); y así sucesivamente.

Asi que...

$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)

Como puede ver, la matriz debajo de la clave [Stock Information:], que en realidad sale de las traducciones (yada, yada...), bajo [0][0] contiene información para usageunit.

Ahora, estaba tratando de array_filter(); los datos de allí, pero lo único que he logrado obtener es $productsBlocks despojado para contener solo [Stock Information:] con todos los datos:

$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)

Y, el resultado que espero con ansias es http://pastebin.com/EqwgpgAP, que he conseguido manualmente print_r($productsUsageUnit['Stock Information:'][0][0]);.


¿Cómo logro esto? (dinamicamente...)

preguntado el 04 de julio de 12 a las 08:07

Dudo que haya profesionales en la escena vTiger, a veces, mientras lees el código fuente, comienzas a preguntarte si los propios desarrolladores tienen una idea de cómo funciona todo junto. -

;) ese es el problema con muchos sistemas / ¿En qué condición decides ['Stock Information:'][0][0] es lo que quieres -

On: ['Stock Information:'][0][0][2] == 'usageunit'. -

podrias agregar otro pastas usar var_export hace que copiar sus datos de entrada sea mucho más fácil;) -

Ver editado TL; DR por var_export Enlace. -

1 Respuestas

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);

Respondido 04 Jul 12, 09:07

El resultado es igual al resultado de mi array_filter() función de devolución de llamada $getUsageUnit anotado en Q, resultando en block datos (totalidad de 'Información de existencias:') no datos de campo (solo la matriz que contiene una subarreglo de valor 'unidad de uso'). - tomsseisums

Ya veo, no estaba muy seguro de cuán estrecho debería ser el resultado. (Actualizando pronto) - Yoshi

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.