将CSV格式化为json以供ui.autocomplete使用

时间:2012-05-23 09:59:36

标签: php jquery drupal

我有格式化CSV输出格式的问题,以使其可以作为json用于jquery ui.autocomplete。

fruit.csv:

apple, bananna, jackfruit, 
... etc

来自这里的jquery:

http://jqueryui.com/demos/autocomplete/#default

$( "#fruits" ).autocomplete({
            source: '/path/to/fruit.json'
        });

PHP将CSV转换为json:

        // Callback function to output CSV as json object
        function _custom_json_from_csv() {
            $fruit_path = '/path/to/fruit.csv';
            $fruits = array_map("str_getcsv", file($fruit_path));
            drupal_json_output(array(array_values($fruits)));
            exit;
        }

       // Below are CMS codes for detailed illustration
            function drupal_json_output($var = NULL) {
              // We are returning JSON, so tell the browser.
              drupal_add_http_header('Content-Type', 'application/json');

              if (isset($var)) {
                echo drupal_json_encode($var);
              }
            }

            function drupal_json_encode($var) {
              // The PHP version cannot change within a request.
              static $php530;

              if (!isset($php530)) {
                $php530 = version_compare(PHP_VERSION, '5.3.0', '>=');
              }

              if ($php530) {
                // Encode <, >, ', &, and " using the json_encode() options parameter.
                return json_encode($var, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
              }

              // json_encode() escapes <, >, ', &, and " using its options parameter, but
              // does not support this parameter prior to PHP 5.3.0.  Use a helper instead.
              include_once DRUPAL_ROOT . '/includes/json-encode.inc';
              return drupal_json_encode_helper($var);
            }

// parts of json-encode.inc - drupal_json_encode_helper(), responsible for json output:
    case 'array':
      // Arrays in JSON can't be associative. If the array is empty or if it
      // has sequential whole number keys starting with 0, it's not associative
      // so we can go ahead and convert it as an array.
      if (empty($var) || array_keys($var) === range(0, sizeof($var) - 1)) {
        $output = array();
        foreach ($var as $v) {
          $output[] = drupal_json_encode_helper($v);
        }
        return '[ ' . implode(', ', $output) . ' ]';
      }
      // Otherwise, fall through to convert the array as an object.

    case 'object':
      $output = array();
      foreach ($var as $k => $v) {
        $output[] = drupal_json_encode_helper(strval($k)) . ':' . drupal_json_encode_helper($v);
      }
      return '{' . implode(', ', $output) . '}';

如果有一个通过jquery直接使用CSV的解决方案,那就太棒了。但现在还没有任何线索。

我的问题是函数 _custom_json_from_csv()输出ui.autocomplete的非预期格式。注意过多[[[...]]]:

[[["apple", "bananna", "jackfruit"]]]

虽然ui.autocomplete想要:

["apple", "bananna", "jackfruit"]

jquery ui.autocomplete预期格式化函数的任何方向?

PS:我不使用#autocomplete_path表单API,而是使用ui.autocomplete,原因如下:

1)代码存储在主题设置中,没有主题可用的hook_menu,我想尽可能避免出现这种需要的模块。

2)d.o处有个计划。要使用ui.autocomplete,请考虑这个冒险的

3)我之前从jquery观点提出的问题让我改为纠正json的输出,而不是让jquery适应json。

4)这是我的php问题,而不是drupal

由于

更新: 从drupal_json_output中删除一个数组(array(array_values($ fruits))); to drupal_json_output(array_values($ fruits));成功减少了一个 [] (这是什么名字?)。显然是先前格式与领导小组的错过。 [[“apple”,“bananna”,“jackfruit”]]

我需要再删除一个 []

2 个答案:

答案 0 :(得分:1)

也许简单就是在js数组[0] [0]中使用(对于drupal_json_output(array(array_values($ fruits))); 在PHP中)或js中的数组[0](对于drupal_json_output(array_values($ fruits));)在php中

答案 1 :(得分:1)

我认为你的代码是“正确的”,如果你有:

apple, bananna, jackfruit
peanut, walnut, almont
carrot, potato, pea

然后你的功能最终会......等等。

[[apple, bananna, jackfruit],[peanut, walnut, almont],[carrot, potato, pea]]

这似乎是明智的。

如果您只想要一行,为什么不能只使用

的结果
$FileContents = file($fruit_path); 
$fruits = str_getcsv($FileContents[0]);

因为它将在第一行中转换值数组,而不是所有行的数组数组