Jacob Evst Jacob Evst - 5 months ago 40
PHP Question

PHP - strpos doesn't work correctly for me?

So I am trying to search through JSON, using strpos for it, but it doesn't for me. I always get that "Items doesn't exist".

Here's the PHP

$getItems = file_get_contents('Items.json');
$decodeItems = json_decode($getItems,true);

//$output = ''.$decodeItems['items'][0]['name'].'';
$output = '';

if(isset($_POST['search'])){
$searchq = $_POST['search'];
$searchq = preg_replace("#[^0-9a-z]#i","",$searchq);

foreach($decodeItems['items'] as $data){
if($chance = strpos($data, $searchq) !== FALSE){
if($data['name'] == $chance){
$name = $data['name'];
$output .= "<div>".$name."</div>";
}
}
else{
$output = 'Items no';
}
}
}


Here's the Example JSON

{"img":"-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXU5A1PIYQh5hlcX0nvUOGsx8DdQBJjIAVHubSaIAlp1fb3YihQ-tWglYy0lfjjOr6fxjpQ7MFz373Fodyl0AXh-ENkMWinJ4eXcA8-ZFHUq1K_xum70ZO56oOJlyUgjHI5fA","name":"&#x2605 Bowie Knife","assetid":"6442574944","myprice":"155.36","condition":"","originalname":"\u2605 Bowie Knife","inspect":"steam:\/\/rungame\/730\/76561202255233023\/+csgo_econ_action_preview%20S76561198034643020A6442574944D2305887113904442996","special":"0","floatvalue":null,"bitskinsprice":"117.36"}

Answer

From the manual the return value of strpos:

Returns the position of where the needle exists relative to the beginning of the haystack string (independent of offset). Also note that string positions start at 0, and not 1.

Returns FALSE if the needle was not found.

So, I suggest you to change this part of your code:

if(strpos($data['name'], $searchq) === true)

to

if(strpos($data['name'], $searchq) !== FALSE)

Updating my answer according to the comments below.

The JSON needs to follow the following notation in order for the code above to work:

{"items":[
   {
      "img":"img1",
      "name":"name1",
      "assetid":"1",
      "myprice":"155.36",
      "condition":"",
      "originalname":"name1 original",
      "inspect":"whatever",
      "special":"0",
      "floatvalue":null,
      "bitskinsprice":"117.36"
   },
   {
      "img":"img2",
      "name":"name2",
      "assetid":"2",
      "myprice":"175.11",
      "condition":"",
      "originalname":"name2 original",
      "inspect":"whatever2",
      "special":"0",
      "floatvalue":null,
      "bitskinsprice":"55.55"
   }
]};

Updating my answer according to the comments below.

OK, I made some changes to your script to deal correctly with the JSON file.

$getItems = file_get_contents('Items.json');
$decodeItems = json_decode($getItems,true);

//$output = ''.$decodeItems['items'][0]['name'].'';
$output = '';

if(isset($_POST['search'])){
    $searchq = $_POST['search'];
    $searchq = preg_replace("#[^0-9a-z]#i","",$searchq);

    foreach($decodeItems['items'] as $data){
       // this was *if($chance = strpos($data, $searchq) !== FALSE){*
       if(strpos($data['name'], $searchq) !== FALSE) {
          // here was another unneeded *if($data['name'] == $chance){*
          $name = $data['name'];
          $output .= "<div>".$name."</div>";
       }
    }

    if (empty($output)) {
      $output = 'Items no';
    }
}
Comments