按类似方式对数组值进行分组

时间:2014-01-22 09:00:12

标签: php arrays

我制作了一个杂货店系统,考虑到你投入的收件人数量。 基于此,它结合了价值并为您输出杂货店。

我循环mysql查询并创建如下数组:

foreach sql loop{
  $ingredients = array(
    "id"=>array($id),
    "name"=>array($name),
    "amount"=>array($amount),
    "unit"=>array($unit)
  );
    foreach ($ingredienser as $key => $value) {
      foreach ($value as $index => $v) {
        echo $key."=";
        echo $v;
        echo "<br><hr>";
      }
    }
 }

如果我扔掉1份食谱,整个考验会输出一个这样的列表:

id=150
name=Cherrytomater
amount=300
unit=Gram
id=151
name=Kyllingfilet
amount=4
unit=Stykk

如果我扔2个收件人,它会抛出下一个食谱。

然而,我需要它做一些事情。

  1. 如果名称相似则合并值
  2. 如果单位不同(毕竟是购物清单),则忽略上述合并
  3. 根据我收到的收件人和收件人数量输出一份综合的成分列表。
  4. 进一步解释;我试图实现的sql相当于:

    $dupe = "2" //amount of similar recipies
    SELECT i.id, i.ingred, r.enhet, r.id, SUM(r.mengde * $dupe) total, r.enhet FROM oppskriftingred r left join ingrediens i on i.id = r.ingrediens WHERE r.oppskriftid IN $vars2 GROUP BY i.ingred, r.enhet ORDER BY i.ingred
    

    然而,sql方法不会起作用,因为SUM不区分不同的收件人..如果$ dupe对于一个食谱是4而对另一个是2,对于两者都是4。

    那么我怎样才能在php中使用数组呢?非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

你的“这就是我需要的清单”有一个问题点: 1.如果名称是SIMILAR,则合并值

其余的很简单。你有一系列的ingerdients $成分。您需要遍历此操作并将每个条目与结果数组进行比较,以确定您的点2和1是否与现有条目或新条目匹配。我会给新数组一个键,使匹配变得容易。我们将单位和名称称为字符串:'Gram-Cherrytomater'

$result = array();
foreach ($ingerdients as $item) {
    $newKey = $item['unit'].'-'.$item['name'];
    if (isset($result[$newKey]) {
        // add amount to existing item
        $result[$newKey]['amount'] += $item['amount'];
    } else {
         // add new item
          $result[$newKey] = $item;
    }
}
// now loop trough the result and display whatever you want

问题在于SIMILAR的问题。我不知道,你想如何比较相似的字符串。你应该在获得$ newKey时这样做。使用$ item ['name']执行某些操作以使其“相似”。

你可以使用一些php函数,比如similar_text(),levenshtein()或soundex()。我不知道这对你的语言有多好(丹麦人?)。