重新格式化没有临时变量

时间:2017-08-15 13:41:45

标签: php arrays format

我有下一个数组

[
    ['id' => 30, 'count' => 3],
    ['id' => 45, 'count' => 7]
]

我需要它

[
    30 => ['count' => 3],
    45 => ['count' => 7]
]

我做了什么

$formatted = [];
foreach ($services as $service) {
    $formatted[$service['id']] = [
        'count' => $service['count']
    ];
}

我想要的是没有临时$格式变量的更优雅的解决方案。谢谢!

更新即可。非常感谢@rtrigoso! 使用laravel集合,我的代码看起来是

$services->reduce(function ($carry, $item) {
        $carry[$item['id']] = ['count' => $item['count']];
        return $carry;
    });

2 个答案:

答案 0 :(得分:5)

您可以使用array_column

在一行中执行此操作
$array = array_column($array, null, 'id');

您想要的输出之间的一个区别是,它仍然包含数组第二级中的id键,如下所示:

[
    30 => ['id' => 30, 'count' => 3],
    45 => ['id' => 45, 'count' => 7],
]

但希望不会引起任何问题。如果您执行需要删除它,您可以使用以下内容执行此操作:

$array = array_map(function ($e) {
    unset($e['id']);
    return $e;
}, $array);

这种方法可能是最好的,如果您的行将来可能会有更多的密钥,即列出删除的密钥而不是要保留的密钥的速度更快。如果没有,并且你只有一个计数,那么说实话,你原来的例子可能是你得到的最好的。

答案 1 :(得分:2)

您可以使用array_reduce

<p>Name:*</p>
<input type="text" name="Name" class="formElem" required>
<p>Company Name: </p>
<input type="text" class="formElem" name="Company_Name">
<p>Email: *</p>
<input type="email" class="formElem" id="email" size="30" name="Email" required>
<p>Phone:*</p>
<input type="text" class="formElem" name="Phone" required>

<div class="checkbox">
  <input id="ckbox" type="checkbox" name="checkbox_name[]" onchange="check()">
  <p>I'm Going</p>
  <input type="checkbox" name="checkbox_name[]">
  <p>thanks, but I can't go</p>

  <input type="checkbox" name="checkbox_name[]" required>
  <p>I have read the above information</p>

  <script>
    function check() {
      var temp = document.getElementsByClassName("formElem");
      if (document.getElementById("ckbox").checked) {            
        for (var e = 0; e < temp.length; e++) { // For each element
          var elt = temp[e];
          elt.required = true;
        }
      } else {
        for (var e = 0; e < temp.length; e++) { // For each element
          var elt = temp[e];
          elt.required = false;
        }
      }
    }
  </script>

它会给你你想要的结果:

$x_arr = array(
    array('id' => 30, 'count' => 3),
    array('id' => 45, 'count' => 7),
);

$y_arr = array_reduce($x_arr, function ($result, $item) {
    $result[$item['id']] = array('count' => $item['count']);
    return $result;
}, array());

print_r($y_arr);