首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据数组值的实例匹配多维数组,只返回一个结果

根据数组值的实例匹配多维数组,只返回一个结果
EN

Stack Overflow用户
提问于 2018-01-17 16:43:53
回答 2查看 50关注 0票数 0

我需要能够匹配数组,基于行值的实例,并且只返回1结果。

我不确定我的措辞是否正确,所以让我解释一下。

例如,假设我有两个数组

代码语言:javascript
复制
  $people = array(
    array(
        'name' => 'Joe',
        'DOB' => '01/01/1990'
    ),
    array(
        'name' => 'John',
        'DOB' => '01/01/1990'
    ),
    array(
        'name' => 'Jane',
        'DOB' => '01/01/1990'
    )
  );
  $sales = array(
    array(
        'name' => 'Car',
        'price' => '1000.00',
        'note' => 'This sale was made by Joe Bloggs'
    ),
    array(
        'name' => 'Car 2',
        'price' => '2000.00',
        'note' => 'Joe Bloggs sold this car today'
    ),
    array(
        'name' => 'Car 3',
        'price' => '3000.00'
        'note' => 'Jane Smith sold our most expensive car'
    )
  );


 foreach($people as $personKey => $person){
      foreach($sales as $saleKey => $sale){
          if($sale['name'] == $person['name']){
              if($sale['price'] > 1000.00){
                  $person[$personKey]['highestSale'] == $saleKey;
              } else {
                  $person[$personKey]['highestSale'] == $saleKey;
              }
          }
      }
 }

我希望能够运行foreach循环,但是使用它可以实现两件事。

  1. 我需要能够搜索第二个foreach循环,只使用当前的名字。我需要它能够搜索$sales['seller']字符串并匹配它,如果它包含$people['name'] (乔将与Joe匹配)。
  2. 我还需要它只在这个循环中获得第一个结果的优先级。因此,if($sale['price'] > 1000.00)是真的,退出person循环的这个实例,然后转到下一个人(每个人只返回一个结果/匹配);

现在它还会回来

“乔的最高销售额是2000.00英镑”

“乔的最高销售额是1000.00英镑”

“简的最高销售额是3000.00英镑”

“约翰的最高售价是Gb0.00”

在运行if语句的循环中,如果if语句为true,则需要它退出当前循环并移到下一行,因此我的结果将改为如下所示。

“乔的最高销售额是2000.00英镑”

“简的最高销售额是3000.00英镑”

“约翰的最高售价是Gb0.00”

我很抱歉,如果这没有道理,这是很难解释它是什么,我正在努力实现!如果有什么需要重新解释的话,请问。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-17 17:00:25

代码语言:javascript
复制
  // Collect names
  $person = array_fill_keys(array_column($people, 'name'), [0]);
  // Add all sales to each seller     
  foreach($sales as $saleKey => $sale){
     if($sale['price'] > 1000.00) {
        $person[explode(' ', $sale['seller'])[0]][] = $sale['price'];
     }
  }
  // Print  names and max value
  foreach($person as $k=>$v) { 
    echo $k ."'s highest sale is £" .  max($v) ."<br>\n";
  }

demo

票数 0
EN

Stack Overflow用户

发布于 2018-01-17 17:17:28

首先按价格按降序对销售进行排序。

代码语言:javascript
复制
usort($sales, function($a, $b) {
    return $b['price'] <=> $a['price'];
});

然后,当您迭代人员时,您可以从sales数组中打印第一个匹配项,这将是他们的最高销售额。如果没有火柴,那么他们的最高销售额是0。

代码语言:javascript
复制
foreach ($people as $person) {
    $highest = '0.00';                                             //default to 0
    foreach ($sales as $saleKey => $sale) {
        if (strpos($sale['note'], $person['name']) !== false) {
            $highest = $sale['price'];
            break;                                                //stop after 1st match
        }
    }
    echo "$person[name]'s highest sale is £$highest<br>";
}

老实说,我不知道>1000个因素是如何影响它的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48306050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档