我有格式化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”]]
我需要再删除一个 []
答案 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]);
因为它将在第一行中转换值数组,而不是所有行的数组数组