【问题标题】:Assign values to every array result in foreach在 foreach 中为每个数组结果赋值
【发布时间】:2021-01-23 07:56:12
【问题描述】:

我已经用 PHP 和 MySql 查询所有特定口味的 cookie 以获取一组 cookie。查询返回每种口味的饼干数量。它只返回数字,就好像我这样做 ->fetch() 有不必要的数组嵌套。

代码如下:

$cookies = array();
$cookies[] = 'Chocolate';
$cookies[] = 'Vanilla';
$cookies[] = 'Stracciatella';

$results = [];
foreach ($cookies as $cookie) {
    $results[] = $this->getEntityManager()->getConnection()->executeQuery(
        "SELECT COUNT(*) FROM sweets WHERE cookies LIKE :cookies",
        ['cookies' => '%"' . $cookie . '"%']
    )->fetchColumn();
}

在这里我得到了类似的结果:

 [
    8,
    4,
    1
 ]

现在,我想将每个值分配给它的 cookie,这样我就可以获得干净的数组键名和结果,例如:

这将是理想的输出:

array('Chocolate' => '8', 'Vanilla' => '4', 'Stracciatella' => '1');

所以我尝试了类似的东西:

  $cookieCount = [];
    foreach ($results as $key => $value) {
        $cookieCount['Chocolate'] = $value;
        $cookieCount['Vanilla'] = $value;
        $cookieCount['Stracciatella'] = $value;
    }

    return $cookieCount;

有人可以帮忙吗?谢谢

【问题讨论】:

  • $results[$cookie] = ...
  • “注意:未定义索引:巧克力”@raina77ow

标签: php mysql arrays multidimensional-array


【解决方案1】:
foreach ($cookies as $cookie) {
    // Set a key here
    $results[$cookie] = $this->getEntityManager()->getConnection()->executeQuery(
        "SELECT COUNT(*) FROM sweets WHERE cookies LIKE :cookies",
        ['cookies' => '%"' . $cookie . '"%']
    )->fetchColumn();
}

并且不需要迭代foreach ($results as $key => $value)。

【讨论】:

  • 感谢您的重播,但它返回的结果是一样的。它的:[8, 4, 1] @u_mulder
  • @gisem1990 你不明白你在做什么,值是 [8, 4 ,1] 但键是 ['Chocolate', 'Vanilla', 'Stracciatella', ...] ,试试 var_dump() 看看。
  • 什么显示print_r($results) 之后 foreach?
【解决方案2】:

你弄错了钥匙,应该是:

    $cookieCount = [];
    foreach ($results as $key => $value) {
        $roleCount[$cookie] = $value;
    }

    return $cookieCount; // or $roleCount ?

【讨论】:

  • 谢谢你,这就搞定了!但它不是返回 count 为 0 的值吗? @Lounis
【解决方案3】:

您可以通过稍微不同的方式执行此操作,并使用一个查询而不是每个 cookie 一个查询来完成您想要的:

$sql = 'SELECT cookies, count(*) as cnt FROM sweets GROUP BY cookies';
$queryResults = $this->getEntityManager()->getConnection()->executeQuery($sql)->fetchAll(PDO::FETCH_ASSOC);
$results = [];
foreach ($queryResults as $queryResult) {
    $results[$queryResult['cookies']] = $queryResult['cnt'];
}

(我不确定您使用的是哪个 DBAL,因此第 3 行可能不正确,但基本上您希望将所有数据作为关联数组获取)

这种方法还意味着数据库中“cookies”的任何值都将自动返回,而无需更改您的 PHP 代码

【讨论】:

  • “注意:未定义的索引:cookie”@Matt 感谢重播。 :)
  • 正如我所说,这可能与第 3 行有关。我不知道您使用的是什么 DBAL,所以不确定您需要调用什么 fn 才能获得 assoc 结果
【解决方案4】:

只要你可以$cookieCount[$cookies[$key]] = $results[$key];

如下图:

$cookies = array();
$cookies[] = 'Chocolate';
$cookies[] = 'Vanilla';
$cookies[] = 'Stracciatella';

$results =  [
    8,
    4,
    1
 ];
 
  $cookieCount = [];
  foreach ($results as $key => $value) {
      $cookieCount[$cookies[$key]] = $results[$key];
  }

    
  return $cookieCount;

输出将是:

数组 ( [巧克力] => 8 [香草] => 4 [Stracciatella] => 1)

【讨论】:

  • 感谢您的重播,但它返回的结果是一样的。它的: [8, 4, 1] @DevsiOdedra
  • @gisem1990 你想要哪种类型的输出?
  • "注意:未定义索引:巧克力" if ->fetch() @DevsiOdedra
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2017-05-03
相关资源
最近更新 更多