将列内容作为数组键获取

6

我将重写一份类似于通讯的东西。

我有一个包含所有通讯领域的表格,如下所示:

field_uid | field_name | field_content | field_letter_id 

比如说,列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"

然后我可以使用以下代码输出内容: ```html

输出的内容

```
echo $field["letter_image"];

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

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

19
$result = array_combine(array_column($data, 'field_name'), $data);

1
给你的答案添加一些解释以便更好地理解。 - Pankaj Makwana
3
尽管您的代码片段可能解决了问题,但您应该描述代码的目的(它是如何解决问题的)。此外,您可能想要查看https://stackoverflow.com/help/how-to-answer。 - Ahmad F
2
@AhmadF 读一下代码,理解起来并不难。array_combine 函数接受两个数组作为参数,并将它们合并在一起,使用第一个数组作为键,第二个数组作为值。array_column 函数从数组中提取一列数据。这是一个很好的解决方案! - IluTov
1
最佳答案!array_column - 从行中提取特定列的值到数组。array_combine - 取第一个数组的键和第二个数组的值。 - user2636594

6

这是一个老问题,但我认为值得一提的是[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答案示例:
应用此方法到@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
最简单的解决方案就是遍历你的数组,像这样:
$result = [];
foreach($data as $row)
{
   $result[$row['field_name']] = $row['field_content'];
}

你可能希望在获取数据时执行此操作(这样你就可以避免两次迭代行)。

4

嗯,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。


1
使用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


-2

嘎嘿...算了吧...

相当简单

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接