0

I am setting up an input autocomplete using jquery tokeninput plugin and XML data.

I have an XML file structured as shown:

<?xml version="1.0" encoding="UTF-8"?>
    <majors>
        <major program="GCIS">Computing &amp; Info Sci (PHD)</major>
        <major program="UINT">Business Administration (AAS)</major>
        etc..
    </majors>

I load it into PHP:

$majors = simplexml_load_file('../ajax/majors.xml');

I then want to do the following things:

  • reformat each <major>element into string, including program attribute

    • (ex: <major program="GCIS">Computing &amp; Info Sci (PHD)</major> turns into string GCIS - Computing &amp; Info Sci (PHD)
  • run the converted string through a filter function. The filter function checks for strpos($convertedString, $userQuery) and returns true/false if the user's query is present
  • elements which DO contain the $userQuery are all then encoded with json_encode($arr)
  • return JSON data.

This is the code I currently have... I can't seem to get the formatting / filtering to work correctly.

if(isset($_POST['query']) ) {
    $majors = simplexml_load_file('../ajax/majors.xml');

    # iterate through.
    foreach ($majors as $key => $value) {
        $arr = array('major' => $value['program'] . " - " . $value);
    }

    # filter the response using our query
    $arr = array_filter($arr, 'filterArrayWithQuery');

    # JSON-encode the response
    $json_response = json_encode($arr);

    # Return the response
    return $json_response;
}

# ensures that the search query is present
function filterArrayWithQuery( $string ) {
    return !strpos( $string, $query ) === false;
}

The end-result JSON output should look like this:

{"major":"GCIS - Computing &amp; Info Sci (PHD)","major":"UINT - Business Administration (AAS)"}
4
  • Is the JSON end-result JSON output correct? Your associative array has 2 keys named "major". Commented Feb 4, 2014 at 19:58
  • @Yeah: The end-result JSON output is my desired output. I want to know what changes I need to make to get that output :) Commented Feb 4, 2014 at 20:00
  • @Prefix That's not valid JSON. So you can't use json_encode() to generate such output. Commented Feb 4, 2014 at 20:08
  • Look at this output format: {"majors":["GCIS - Computing & Info Sci (PHD)","UINT - Business Administration (AAS)"]}. Is it suits to you? Commented Feb 4, 2014 at 20:16

3 Answers 3

1

In your iterate through line, you are not appending new entries -

# iterate through.
foreach ($majors as $key => $value) {
   $arr[] = array('major' => $value['program'] . " - " . $value);
//     ^^
}

With this the output would be-

[{"major":"GCIS - Computing & Info Sci (PHD)"},{"major":"UINT - Business Administration (AAS)"}]
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you -- this was part of the issue in my initial code which I oversaw. I upvoted you for the contribution. I also figured out another issue (I was "returning" the JSON and not echoing it -- apparently you must echo JSON data? )
0

Try this:

function convert($xml) {
    # ensures that the search query is present
    function filterArrayWithQuery($string) {
        static $query = null;
        if (is_null($query) && isset($_POST['query'])) $query = $_POST['query'];
        return !$query || strpos($string, $_POST['query']) !== false;
    }

    $majors = simplexml_load_string($xml);
    $arr = array();

    # iterate through
    foreach ($majors as $key => $value) {
        $arr[] = array('major' => $value['program'] . " - " . htmlentities($value));
    }

    # filter the response using our query
    $arr = array_filter($arr, 'filterArrayWithQuery');

    # Return the response (JSON-encoded)
    return json_encode(array('majors' => $arr));
}

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
    <majors>
        <major program="GCIS">Computing &amp; Info Sci (PHD)</major>
        <major program="UINT">Business Administration (AAS)</major>
    </majors>
XML;

$_POST['query'] = 'Info';
echo convert($xml);

Comments

0

Thank you to the input I received, however I was able to figure out the solution.

Here is the final PHP script for those interested.

<?php


# vars
$reqMethod    = $_SERVER['REQUEST_METHOD'];
$ref          = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : "http://www.google.com";                            
$allowedHosts = array('redacted', 'localhost'); 
$majors       = null;
$arr          = array();
$query        = isset($_POST['q']) ?  $_POST['q'] : "";

# confirm request is being sent from where we allow.
if ( $reqMethod != 'POST' || !in_array(parse_url($ref, PHP_URL_HOST), $allowedHosts) ) {

    header('Location: ' . $ref);

} else {

    # load in XML
    $majors = simplexml_load_file('../ajax/majors.xml');

    # iterate through XML. if element contains query, add it to an array.
    foreach ($majors as $key => $value) {
        if( !stristr( $value, $query ) === false ){
            $arr[] = array('major' => $value['program'] . " - " . $value);
        }
    }

    # Return the response - JSON encoded
    header('Content-type: application/json');
    echo json_encode($arr);

}

?>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.