【问题标题】:Searching JSON array for values and accessing surrounding keys/values; output as JSON在 JSON 数组中搜索值并访问周围的键/值;输出为 JSON
【发布时间】:2015-03-22 22:28:38
【问题描述】:

我在尝试做一些我认为应该很简单的事情时遇到了最困难的事情。我已经阅读了许多有关访问 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',我想将它作为 JSON 返回(包括 aname、sname、main、maininfo 等)。预期会有多个结果。 JSON 现在按预期返回,但用户不会搜索“1”、“2”等,因此它不是真正可用的。

提前感谢您的宝贵时间!

【问题讨论】:

  • 您大概想匹配内容(值)?您的循环正在将数字键 1 和 2 与搜索词进行比较,您需要一个额外的循环。如果要匹配值而不是键,则需要将 stripos() 更改为 $data 而不是 $name - 例如:eval.in/303046
  • 这非常有效@scrowler - 它似乎匹配任何值。我可以将其限制为仅偶然搜索“完整”吗?现在,如果您搜索“核心”(例如),它会在“主”键中查找内容。我希望它只搜索一个特定的键(“完整”)。这实际上已经解决了,非常感谢。
  • @scrowler - 这真的很好,但它匹配所有东西,它带回了一些我不想要的东西。是否可以简单地匹配“完整”键中的值。非常感谢任何帮助!
  • 是的,在这种情况下你想使用if (stripos($data['full'], $q) !== false)
  • @scrowler - 你真的可以提交这个作为答案吗?这是完美的,最接近我原来的问题。库尔特在下面提供了一些非常好的答案,但是它们是出于我的目的而过度设计的。 非常感谢您的帮助--简直不敢相信我花了这么多时间,而且这么简单。

标签: php json


【解决方案1】:

你需要判断是否有匹配并在你的外循环中返回数组

$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(); 

【讨论】:

  • 你能稍微修改一下吗?获取未定义的变量:final。提前感谢您的帮助,非常感谢。
  • 感谢您的快速回复。仍然出现错误:未定义的偏移量:0 - 这是在搜索 file.php?q=ArtistName 时 --- 请注意,我正在寻找部分匹配项,所以如果艺术家姓名是 Rick Smith,我希望它能够匹配 Rick也是。再次感谢。
  • 然后使用 'similar_text ( string $first , string $second [, float &$percent ] ) ' 来生成你的匹配,它以百分比形式返回一个变量的匹配。检查两个'
    '标签之间未定义的offest'print_r(array)的数组索引
  • 你能提供一个例子@kurt吗?对不起——我不明白这个。
  • 抱歉拖了这么久,我去睡觉了。它需要一个额外的 for 循环,您可以复制并粘贴我的示例,然后对其进行修改以获取
猜你喜欢
  • 2023-02-24
  • 2015-01-20
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多