0

我在格式化 CSV 输出以使其可用作 jquery ui.autocomplete 的 json 时遇到 php 问题。

水果.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) 有一个使用 ui.autocomplete 的计划,所以考虑一下这个冒险

3)我之前从jquery的角度提出的问题导致我改正了json的输出,而不是让jquery适应json。

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

谢谢

更新:从 drupal_json_output(array(array_values($fruits))) 中删除一个数组;到 drupal_json_output(array_values($fruits)); 成功减少了一个[](这个叫什么名字?)。显然与领导小组的先前格式相去甚远。 [[“苹果”、“香蕉”、“菠萝蜜”]]

我需要再删除一个[]

4

2 回答 2

1

也许简单的是在 js 中使用 array[0][0](for drupal_json_output(array(array_values($fruits))); 在 php) 或 array[0] 在 js(for drupal_json_output(array_values($fruits));) 中php

于 2012-05-23T10:37:29.517 回答
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]);

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

于 2012-05-23T10:45:33.860 回答