搜索JSON数组中的值并访问周围的键/值;输出为JSON


Searching JSON array for values and accessing surrounding keys/values; output as JSON

我正经历着最艰难的时刻,试图做一些我认为应该简单的事情。我读过很多关于访问PHP JSON数组的例子,但我似乎找不到一个适合我的用例(或者我不明白这些部分是如何适合的)。

这是我在PHP中的JSON(example_data.PHP):

<?php
$contents = array(
    1 => array(
        'contentid' => '1',
        'full' => 'Song Name by Artist Name (maininfo)',
        'aname' => 'Artist Name',
        'sname' => 'Song Name',
        'main' => 'core content #1',
        'maininfo' => 'url'
    ),
    2 => array(
        'contentid' => '2',
        'full' => 'Song Name by Artist Name (maininfo)',
        'aname' => 'Artist Name',
        'sname' => 'Song Name',
        'main' => 'core content #2',
        'maininfo' => 'url')
    );
?>

下面的代码将一个搜索变量(q)作为输入,并将其传递给JSON以搜索部分或完全匹配。

<?php
$q = $_GET['q'];
include('example_data.php');
$results = array('contents' => array());
foreach ($contents as $name => $data)
{
    if (stripos($name, $q) !== false)
    {
        $results['contents'][$name] = $data;
    }
}
$final_contents = array('header' => array(), 'data' => array());
$final_contents['header'] = array('title' => 'Music', 'num' =>  count($results['contents']), 'limit' => 6);

foreach ($results['contents'] as $name => $data)
{
    $final_contents['data'][] = array('primary' => $data['sname'], 'secondary' => $data['aname']);
}
/* Output JSON */
$final = array($final_contents);
header('Content-type: application/json');
echo json_encode($final);
die();
?>

它工作正常,但只会根据数组名称(本例中为"1"或"2")搜索匹配项。显然,用户不会搜索"1",而是搜索"艺人名称"或"歌曲名称"或核心内容。

有人能告诉我如何修改这段代码,使其采用"q",并将其用作对"full"键的搜索吗?特别是,如果"full"的值中存在部分/完全匹配,我希望将其作为JSON返回(包括aname、sname、main、maininfo等)。预计会有多个结果。JSON现在按预期返回,但用户不会搜索"1"、"2"等,因此它实际上不可用。

真的很感激你提前抽出时间!

您需要确定是否存在匹配,并在外循环中返回数组

$contents = array(
    1 => array(
        'contentid' => '1',
        'full' => 'Song Name by Artist Name (maininfo)',
        'aname' => 'Artist Name',
        'sname' => 'Song Name',
        'main' => 'core content #1',
        'maininfo' => 'url'
    ),
    2 => array(
        'contentid' => '2',
        'full' => 'Song Name by Artist Name (maininfo)',
        'aname' => 'Artist Name',
        'sname' => 'Song Name',
        'main' => 'core content #2',
        'maininfo' => 'url')
    );
$a = 'song'; // value that will be searched for in all fields
$percent = NULL;
$results = array();
$match = FALSE;
echo "starting search...<br>";
foreach($contents as $name) {
	foreach($name as $key =>$val){
	echo "starting full field match...<br>";
	if (isset($q) && similar_text($val,$a ,$percent )) {
	   echo $name."[".$key."] = ".$val." vs ".$a." Percentage Match: ".$percent." % <br>";
	  ($percent >40 ? $match = TRUE : $match = FALSE);
      if($match){
	  echo "MATCHED % greater 40% match...<br>";
	      break;
	  }
	  echo " end full field match<hr>";
    }
	
	
    if (isset($a) && similar_text($val,$a ,$percent )) {
	echo "starting name match...<br>";
       echo $name."[".$key."] = ".$val." vs ".$a." Percentage Match: ".$percent." % <br>";
	  ($percent >40 ? $match = TRUE : $match = FALSE);
      if($match){
	  echo "MATCHED % greater 40% match...<br>";
	      break;
	  }
    }
	echo " end name  match<hr>";
	}
    if ($match) {
	echo "Match added to array<br>";
      //push full array
      array_push($results, $name);
    }
   
  }
  echo "search completed<hr>";
  /* Output JSON */
header('Content-type: application/json');
echo json_encode($results[0]);
die();