【问题标题】:How to use array_search for searching values from multiple values in an array如何使用 array_search 从数组中的多个值中搜索值
【发布时间】:2019-08-20 12:02:54
【问题描述】:

我有如下数组 $DATA

{
    "LSP": "EXB",
    "AWB": "8421604",
    "SCANS": [
        {
            "SCAN_TIME": "2019-07-17 20:05:00",
            "SCAN_STATUS": "Uploaded",
            "SCAN_CODE": "001",
            "SCAN_LOCATION": "DLH"
        },
        {
            "SCAN_TIME": "2019-07-18 15:52:00",
            "SCAN_STATUS": "Picked Up",
            "SCAN_CODE": "0011",
            "SCAN_LOCATION": "DLH"
        },
        {
            "SCAN_TIME": "2019-07-19 00:22:00",
            "SCAN_STATUS": "Scanned",
            "SCAN_CODE": "003",
            "SCAN_LOCATION": "GAX"
        }

    ]
}

$CODES = array("0011","003");

现在我想从 $DATA

中搜索 $CODES 中的 SCAN_CODE

所以使用 array_search 同样会返回错误。 我目前获取 KEY 的代码是

$SEARCH_KEY = array_search($CODES,array_column($DATA,"SCAN_CODE"));

$SEARCH_KEY 返回

我的要求是获得 first INDEX VALUE,即使 SCAN_CODE 有多个具有相同 VALUE 的 INDEXES,我猜 array_search 只返回第一个实例。

【问题讨论】:

  • 如果仔细观察,SCANS 包含对象数组,要使用 array_search 函数,您需要先将其转换为数组
  • $DATA 无法使用 array_column。在$DATA['SCANS'] 上使用它应该可以工作。请发布一个有效的 json。
  • @Andreas 注意:未定义索引:SCANS 警告:array_column() 期望参数 1 是数组 警告:array_search() 期望参数2为数组
  • 是的,那是因为您的 json 无效。发布真正的json
  • @Andreas 还有,array_search("003",array_column($DATA,"SCAN_CODE"));工作完美,因为它是正在搜索的字符串。但它不适用于 $CODES 代替“003”

标签: php arrays multidimensional-array


【解决方案1】:

假设您的 $DATA 实际上是 JSON 源,并且您已经编辑了其中的一些并留下了一个悬空的逗号,那么此代码将为您找到 $CODES 中的值之一的最低索引出现。请注意,您必须单独搜索值,因为 array_search 否则会查找数组作为要匹配的值。

$DATA = json_decode($json, true);
$CODES = array("0011","003");
$SEARCH_KEY = count($DATA['SCANS']);
foreach ($CODES as $CODE) {
    $SEARCH_KEY = min($SEARCH_KEY, array_search($CODE,array_column($DATA['SCANS'],"SCAN_CODE")));
}
echo $SEARCH_KEY;

输出(用于您的数据):

1

Demo on 3v4l.org

如果您想找到与其中一个代码匹配的最早SCAN_TIME 的扫描,您可以对SCANS 进行排序,然后在排序后的数组中获取索引,例如

$DATA = json_decode($json, true);
$CODES = array("0011","003");
$SEARCH_KEY = count($DATA['SCANS']);
$SCANS = $DATA['SCANS'];
array_multisort(array_column($SCANS, 'SCAN_TIME'), $SCANS);
print_r($SCANS);
foreach ($CODES as $CODE) {
    $SEARCH_KEY = min($SEARCH_KEY, array_search($CODE,array_column($SCANS,"SCAN_CODE")));
}
print_r($SCANS[$SEARCH_KEY]);

输出(对于我在this demo 中更改的数据):

Array
(
    [SCAN_TIME] => 2019-07-19 00:22:00
    [SCAN_STATUS] => Scanned
    [SCAN_CODE] => 003
    [SCAN_LOCATION] => GAX
)

【讨论】:

  • 没有 foreach 会不会工作?此外,很有可能在 SCANS 下会有多个实例,所以我需要根据 SCAN_TIME 的值升序查找我的 array_search() 的第一个实例来自 $DATA['SCANS']。
  • @Alpha 不,请参阅我对您问题的评论。如果 SCANS 中的值是按时间顺序排列的,这段代码会找到第一个。
  • @Alpha 看到我的编辑。如果扫描不按时间顺序,新代码将为您提供与 $CODES 数组中的值匹配的最早时间值。
【解决方案2】:

array_search 期望将参数作为字符串进行搜索。您正在传递一个array。 您需要循环遍历$CODES 并搜索每个代码。

foreach( $CODES as $code ) {
    $SEARCH_KEY = array_search( $code , array_column($DATA['SCANS'],"SCAN_CODE"));
    if( $SEARCH_KEY !== false ) { //If we have find the Key, break from the loop.
        break;
    }
}

这是工作的demo

【讨论】:

  • 我认为这将返回最后一个值,我想要基于 SCAN_TIME 升序的 $DATA['SCANS'] 中的 $CODES 中的任何值的第一个实例
  • @Alpha 更新了返回第一个键的答案。以前它获取所有密钥。
【解决方案3】:

<?php 
$someJSON = '{
	        "LSP": "EXB",
            "AWB": "8421604",
			"SCANS": [{"SCAN_TIME": "2019-07-17 20:05:00",
			"SCAN_STATUS": "Uploaded",
			"SCAN_CODE": "001",
			"SCAN_LOCATION": "DLH"
			},{
            "SCAN_TIME": "2019-07-18 15:52:00",
            "SCAN_STATUS": "Picked Up",
            "SCAN_CODE": "0011",
            "SCAN_LOCATION": "DLH"
        },
        {
            "SCAN_TIME": "2019-07-19 00:22:00",
            "SCAN_STATUS": "Scanned",
            "SCAN_CODE": "003",
            "SCAN_LOCATION": "GAX"
        }

    ]
}';

 $someArray = json_decode($someJSON, true);
 $CODES = array("0011","003");
 $matched=array();
foreach($someArray['SCANS'] as $item)
{
   
	if (in_array($item['SCAN_CODE'], $CODES))
    {
	   
	   array_push($matched,$item['SCAN_CODE']);
	  
    }
}
echo"<pre>";
print_r($matched);
exit;

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-18
    • 2021-01-19
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多