我在格式化 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)); 成功减少了一个[](这个叫什么名字?)。显然与领导小组的先前格式相去甚远。 [[“苹果”、“香蕉”、“菠萝蜜”]]
我需要再删除一个[]