将json数据输入智能建议插件

时间:2011-10-30 20:35:12

标签: php arrays json autocomplete

我已经购买了名为smart suggest的jquery插件,并希望将json数组作为数据而不是数组传递。

当前数据文件'sample-data.php'如下所示:


     array('image' => 'assets/images/fruits/apple.jpg', 'description' => 'One of America\'s favorite fruits.'),
                                    'Avocado' => array('image' => 'assets/images/fruits/avocado.jpg', 'description' => 'The avocado is a dense, evergreen tree, shedding many leaves in early spring.'),
                                    'Banana' => array('image' => 'assets/images/fruits/banana.jpg', 'description' => 'Bananas are fast-growing herbaceous perennials arising from underground rhizomes.'),
                                    'Gooseberry' => array('image' => 'assets/images/fruits/gooseberry.jpg', 'description' => 'Gooseberries are deciduous shrubs.'),
                                    'Grape' => array('image' => 'assets/images/fruits/grape.jpg', 'description' => 'Grapes come in large clusters.'),
                                    'Jackfruit' => array('image' => 'assets/images/fruits/jackfruit.jpg', 'description' => 'The jackfruit tree is handsome and stately.'),
                                    'Mango' => array('image' => 'assets/images/fruits/mango.jpg', 'description' => 'Mango trees make handsome landscape specimens and shade trees.'),
                                    'Papaya' => array('image' => 'assets/images/fruits/papaya.jpg', 'description' => 'The papaya is a short-lived, fast-growing, woody, large herb to 10 or 12 feet in height. It is also regarded by some as being delicious.'),
                                    'Peach' => array('image' => 'assets/images/fruits/peach.jpg', 'description' => 'These are great in the summertime.'),
                                    'Pear' => array('image' => 'assets/images/fruits/pear.jpg', 'description' => 'Pears are delicious fruits.'),
                                    'Pineapple' => array('image' => 'assets/images/fruits/pineapple.jpg', 'description' => 'The pineapple plant is a herbaceous perennial, 2-1/2 to 5 ft.'),
                                    'Rose Apple' => array('image' => 'assets/images/fruits/rose_apple.jpg', 'description' => 'The rose apple is a highly decorative evergreen large shrub.'),
                                    'Tamarind' => array('image' => 'assets/images/fruits/tamarind.jpg', 'description' => 'The bright green, pinnate foliage is dense and feathery in appearance.'),
                                    'White Sapote' => array('image' => 'assets/images/fruits/white_sapote.jpg', 'description' => 'The white sapote forms a medium to very large evergreen tree.'),
                                );
    $vegetables = array(
                                    'Alfalfa' => array('image' => 'assets/images/fruits/alfalfa.jpg', 'description' => 'One cup of raw, sprouted alfalfa seeds, contains 1.32 grams of protein.'),
                                    'Artichoke' => array('image' => 'assets/images/fruits/artichoke.jpg', 'description' => 'One medium artichoke cooked with no added salt has 3.47 grams protein.'),
                                    'Asparagus' => array('image' => 'assets/images/fruits/asparagus.jpg', 'description' => 'Half cup (about 6 spears) cooked with no added salt contains 2.16 grams of protein.'),
                                    'Broccoli' => array('image' => 'assets/images/fruits/broccoli.jpg', 'description' => 'Half cup of broccoli, cooked with no added salt contains 1.86 grams protein.'),
                                    'Carrots' => array('image' => 'assets/images/fruits/carrots.jpg', 'description' => 'Half cup cooked with no added salt contains 0.59 grams protein.'),
                                    'Celery' => array('image' => 'assets/images/fruits/celery.jpg', 'description' => 'One cup of celery, cooked, boiled, drained with no added salt has 1.25 grams protein.'),
                                    'Corn' => array('image' => 'assets/images/fruits/corn.jpg', 'description' => 'One large ear of yellow corn, cooked with no salt contains 4.02 grams protein.'),
                                    'Green Pepper' => array('image' => 'assets/images/fruits/green_pepper.jpg', 'description' => 'One small raw pepper contains 0.64 grams protein.'),
                                    'Mushroom' => array('image' => 'assets/images/fruits/mushroom.jpg', 'description' => 'Half a cup of raw mushrooms contains 1.08 grams of protein.'),
                                    'Onion' => array('image' => 'assets/images/fruits/onion.jpg', 'description' => 'One small onion cooked without salt contains 0.82 grams protein.'),
                                    'Potato' => array('image' => 'assets/images/fruits/potato.jpg', 'description' => 'One medium baked potato without salt contains 4.33 grams of protein.'),
                                    'Spinach' => array('image' => 'assets/images/fruits/spinach.jpg', 'description' => 'One cup of raw spinach contains 0.86 grams of protein.'),
                                    'Squash' => array('image' => 'assets/images/fruits/squash.jpg', 'description' => 'One cup of sliced summer squash, boiled with no added salt contains 1.87 grams of protein.'),
                                );
    ?>

这个数组被传递到'search_multiple.php'文件中,我希望将其作为JSON传递:


     array(), 'vegetables' => array());
    foreach ($fruits as $name => $data)
    {
        if (stripos($name, $q) !== false)
        {
            $results['fruits'][$name] = $data;
        }
    }
    foreach ($vegetables as $name => $data)
    {
        if (stripos($name, $q) !== false)
        {
            $results['vegetables'][$name] = $data;
        }
    }

    /* Get the data into a format that Smart Suggest will read (see documentation). */
    $final_fruits = array('header' => array(), 'data' => array());
    $final_fruits['header'] = array(
                                                                            'title' => 'Fruits',                                        # Appears at the top of this category
                                                                            'num' => count($results['fruits']),         # Displayed as the total number of results.
                                                                            'limit' => 5                                                        # An arbitrary number that you want to limit the results to.
                                                                        );
    foreach ($results['fruits'] as $name => $data)
    {
        $final_fruits['data'][] = array(
                                                            'primary' => $name,                                                                                         # Title of result row
                                                            'secondary' => $data['description'],                                                        # Description below title on result row
                                                            'image' => $data['image'],                                                                          # Optional URL of 40x40px image
                                                            'onclick' => 'alert(\'You clicked on the '.$name.' fruit!\');', # JavaScript to call when this result is clicked on
                                                            'fill_text' => strtolower($name)                                                                        # Used for "auto-complete fill style" example
                                                        );
    }

    $final_vegetables = array('header' => array(), 'data' => array());
    $final_vegetables['header'] = array(
                                                                            'title' => 'Vegetables',                                        # Appears at the top of this category
                                                                            'num' => count($results['vegetables']),         # Displayed as the total number of results.
                                                                            'limit' => 5                                                                # An arbitrary number that you want to limit the results to.
                                                                        );
    foreach ($results['vegetables'] as $name => $data)
    {
        $final_vegetables['data'][] = array(
                                                            'primary' => $name,                                                                                                 # Title of result row
                                                            'secondary' => $data['description'],                                                                # Description below title on result row
                                                            'image' => $data['image'],                                                                                  # Optional URL of 40x40px image
                                                            'onclick' => 'alert(\'You clicked on the '.$name.' vegetable!\');', # JavaScript to call when this result is clicked on
                                                            'fill_text' => strtolower($name)                                                                        # Used for "auto-complete fill style" example
                                                        );
    }

    /* Output JSON */
    $final = array($final_fruits, $final_vegetables);
    header('Content-type: application/json');
    echo json_encode($final);
    die();
    ?>

我想知道如何将json数据传递到'search_multiple.php'文件中。例如:

<?php
$fruits = '{
    "Apple":{"image":"assets/images/fruits/apple.jpg","description":"One of America\'s favorite fruits."},
    "Avocado":{"image":"assets/images/fruits/avocado.jpg","description":"The avocado is a dense, evergreen tree, shedding many leaves in early spring."}
    "Banana":{"image":"assets/images/fruits/banana.jpg","description":"Bananas are fast-growing herbaceous perennials arising from underground rhizomes."},
    "Gooseberry":{"image":"assets/images/fruits/gooseberry.jpg","description":"Gooseberries are deciduous shrubs."}
    "Grape":{"image":"assets/images/fruits/grape.jpg","description":"Grapes come in large clusters."},
    "Jackfruit":{"image":"assets/images/fruits/jackfruit.jpg","description":"The jackfruit tree is handsome and stately."}
    "Mango":{"image":"assets/images/fruits/mango.jpg","description":"Mango trees make handsome landscape specimens and shade trees."},
    "Papaya":{"image":"assets/images/fruits/papaya.jpg","description":"The papaya is a short-lived, fast-growing, woody, large herb to 10 or 12 feet in height. It is also regarded by some as being delicious."}
    "Peach":{"image":"assets/images/fruits/peach.jpg","description":"These are great in the summertime."},
    "Pear":{"image":"assets/images/fruits/pear.jpg","description":"Pears are delicious fruits."},
    "Pineapple":{"image":"assets/images/fruits/pineapple.jpg","description":"The pineapple plant is a herbaceous perennial, 2-1/2 to 5 ft."}
    "Rose Apple":{"image":"assets/images/fruits/rose_apple.jpg","description":"The rose apple is a highly decorative evergreen large shrub."},
    "Tamarind":{"image":"assets/images/fruits/tamarind.jpg","description":"The bright green, pinnate foliage is dense and feathery in appearance."}
    "White Sapote":{"image":"assets/images/fruits/white_sapote.jpg","description":"One cup of sliced summer squash, boiled with no added salt contains 1.87 grams of protein."},
            }';
$vegetables = '{
    "Alfalfa":{"image":"assets/images/fruits/apple.jpg","description":"One of America\'s favorite fruits."},
    "Artichoke":{"image":"assets/images/fruits/avocado.jpg","description":"The avocado is a dense, evergreen tree, shedding many leaves in early spring."}
    "Asparagus":{"image":"assets/images/fruits/banana.jpg","description":"Bananas are fast-growing herbaceous perennials arising from underground rhizomes."},
    "Broccoli":{"image":"assets/images/fruits/gooseberry.jpg","description":"Gooseberries are deciduous shrubs."}
    "Carrots":{"image":"assets/images/fruits/grape.jpg","description":"Grapes come in large clusters."},
    "Celery":{"image":"assets/images/fruits/jackfruit.jpg","description":"The jackfruit tree is handsome and stately."}
    "Corn":{"image":"assets/images/fruits/mango.jpg","description":"Mango trees make handsome landscape specimens and shade trees."},
    "Green Pepper":{"image":"assets/images/fruits/papaya.jpg","description":"The papaya is a short-lived, fast-growing, woody, large herb to 10 or 12 feet in height. It is also regarded by some as being delicious."}
    "Mushroom":{"image":"assets/images/fruits/peach.jpg","description":"These are great in the summertime."},
    "Onion":{"image":"assets/images/fruits/pear.jpg","description":"Pears are delicious fruits."},
    "Potato":{"image":"assets/images/fruits/pineapple.jpg","description":"The pineapple plant is a herbaceous perennial, 2-1/2 to 5 ft."}
    "Spinach":{"image":"assets/images/fruits/rose_apple.jpg","description":"The rose apple is a highly decorative evergreen large shrub."},
    "Squash":{"image":"assets/images/fruits/tamarind.jpg","description":"The bright green, pinnate foliage is dense and feathery in appearance."}
            }';
?>

文档在http://jamesskidmore.com/scripts/smartsuggest/

我已经在http://kabeerpc.tk上主持了我当前的进展。

1 个答案:

答案 0 :(得分:2)

没有 JSON数组; JSON文档中的数组只是数组的表示(或序列化)。因此,您可以简单地解码JSON:

<?php
$fruits_json = '{
    "Apple":{"image":"assets/images/fruits/apple.jpg",
             "description":"One of America\'s favorite fruits."},
    "Avocado":{"image":"assets/images/fruits/avocado.jpg",
             "description":"The avocado is a dense, evergreen tree."}}';
$vegetables_json = '{
    "Alfalfa":{"image":"assets/images/fruits/pear.jpg",
               "description":"An american alfafa."},
    "Artichoke":{"image":"assets/images/fruits/peach.jpg",
                 "description":"An American artichoke."}}';
// Decode input JSON
$fruits = json_decode($fruits_json, true);
$vegetables = json_decode($vegetables_json, true);

$q = isset($_GET['q']) ? $_GET['q'] : '';
$final = array(
  _construct_smartSuggestion('fruits', $fruits, $q),
  _construct_smartSuggestion('vegetables', $vegetables, $q)
);
header('Content-type: application/json');
die(json_encode($final));

function _construct_smartSuggestion($name, $described, $q) {
  $data = array();
  foreach ($described as $dname=>$d) {
    // Search for the search query
    if (stripos($dname, $q) === false &&
        stripos($d['description'], $q) === false) {
      continue;
    }

    $data[] = array('primary' => $dname,
                    'secondary' => $d['description'],
                    'image' => $d['image']);
  }
  $header = array('title'=>$name, 'num'=>count($data), 'limit'=>5);
  return array('header'=>$header, 'data'=>$data);
}

确保您的JSON序列化有效。您的示例JSON在许多条目(例如Avocado)之后缺少逗号。

Here's a live demo。搜索American将产生四个可用结果中的三个。