【问题标题】:Get column content as array key获取列内容作为数组键
【发布时间】:2013-10-19 07:44:03
【问题描述】:

我正在重写一个时事通讯。

我有一个包含所有时事通讯字段的表格,如下所示:

field_uid | field_name | field_content | field_letter_id 

在哪里 f.x. field_name 列的值可以是 letter_headline 并且field_content 列的值可以是My headline

当我这样做时:

$fields = $this->db->dbh->query("SELECT field_name, field_content FROM newsletter_fields WHERE field_letter_uid = '". $letter_id ."'"); 

foreach($fields->fetchAll(PDO::FETCH_ASSOC) as $key) {
   print_r($key);
}

它会正确地给我这个:

Array ( [field_name] => letter_image0 [field_content] => image.jpg ) 
Array ( [field_name] => letter_headline [field_content] => My headline ) 
Array ( [field_name] => letter_headline_size [field_content] => 12 ) 
Array ( [field_name] => letter_sub_headline [field_content] => My subheadline ) 
Array ( [field_name] => letter_sub_headline_size [field_content] => 10 ) 
Array ( [field_name] => letter_content [field_content] => Letter content ) 
Array ( [field_name] => letter_link [field_content] => www.example.com )
Array ( [field_name] => letter_link_txt [field_content] => Example )

我想要的是建立一个这样的数组

$field["letter_image"] = "image.jpg";
$field["letter_headline"] = "My headline"

然后我可以输出内容:

echo $field["letter_image"];

但我似乎无法弄清楚如何设置字段数组。

【问题讨论】:

  • 2 个问题: - letter_image 后面总是跟一个数字吗? - 您是否希望您的$field 数组保持一致(即,您的letter_imageletter_headline 是否关联)?

标签: php mysql arrays foreach


【解决方案1】:
$result = array_combine(array_column($data, 'field_name'), $data);

【讨论】:

  • 为您的答案添加一些解释以便更好地理解。
  • 虽然您的代码 sn-p 可能会解决问题,但您应该描述您的代码的目的是什么(它如何解决问题)。此外,您可能需要检查stackoverflow.com/help/how-to-answer
  • @AhmadF 阅读代码,不是很难理解。 array_combine 接受两个数组并将它们组合起来,将第一个数组用作键,将第二个数组用作值。 array_column 从数组中提取一列。这是一个很好的解决方案!
  • 最佳答案! array_column - 从行中的特殊 col 中提取值到数组。 array_combine - 从第一个数组中获取键,从第二个数组中获取值。
【解决方案2】:

最简单的解决方案就是遍历您的数组,例如:

$result = [];
foreach($data as $row)
{
   $result[$row['field_name']] = $row['field_content'];
}

您可能希望在 fetch 周期中执行此操作(这样您就可以避免重复遍历行两次)

【讨论】:

    【解决方案3】:

    嗯,almas 的解决方案没有使用经过优化的本机实现。

    我不是说它错了,只是没有优化。

    这应该优化:

      $x = [['id' => 5, 'name' => 'john'], ['id' => 15, 'name' => 'jim']];
    
      $keys = array_column($x, 'id');
      $values = array_column($x, 'name');
      $result = array_combine($keys, $values);
    
      var_dump($result);
    
    //outputs array(2) { [5]=> string(4) "john" [15]=> string(3) "jim" }
    

    这不适用于 PHP 4,仅适用于 php > 5.5

    【讨论】:

      【解决方案4】:

      这是一个老问题,但我认为值得一提的是[array_column][1]函数可以接受列的名称作为数组键作为第三个参数,所以最简单的解决方案是:

      // field_content column will be used as values of the array
      // field_name column will be used as keys
      $result = array_column($data, 'field_content', 'field_name');
      

      将此应用于@Toskan 回答的示例:

      $x = [['id' => 5, 'name' => 'john'], ['id' => 15, 'name' => 'jim']];
      $result = array_column($x, 'name', 'id');
      
      print_r($result);
      // outputs Array ( [5] => john [15] => jim )
      

      【讨论】:

        【解决方案5】:

        使用array_column的第三个参数

        $rows = [
            [
                'field_name' => 'letter_image',
                'field_content' => 'image.jpg'
            ],
            [
                'field_name' => 'letter_headline',
                'field_content' => 'My headline'
            ],
        ];
        
        $fields = array_column($rows, 'field_content', 'field_name');
        
        ---
        
        php > var_dump($fields);
        array(2) {
          ["letter_image"]=>  string(9) "image.jpg"
          ["letter_headline"]=>  string(11) "My headline"
        }
        
        

        https://www.php.net/manual/es/function.array-column.php

        【讨论】:

          【解决方案6】:

          Garh...没关系..

          相当简单

          $field[$key["field_name"]] = $key["field_content"];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-31
            • 1970-01-01
            • 2019-07-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多