【问题标题】:Make my array pretty让我的阵列漂亮
【发布时间】:2014-07-17 20:45:24
【问题描述】:

我有一个结构像这样的数组

  • foo = 这个例子中我们不关心的东西
  • foo1_value
  • foo1_label
  • foo1_unit
  • foo2_value
  • foo3_label
  • foo3_value

你能想出一个快速的方法让它看起来像这样吗?

  • foo1
    • 价值
    • 标签
    • 单位
  • foo2
    • 价值
  • foo3
    • 价值
    • 标签

我实际上正在尝试这样的事情:

array_walk($array, function($val, $key) use(&$nice_array) {
        $match = false;
        preg_match("/_label|_value|_unit|_libelle/", $key, $match);
        if (count($match)) {
            list($name, $subName) = explode('_', $key);
            $nice_array[$name][$subName] = $val;
        } else {
            $nice_array[$key] = $val;
        }
    });


    echo '<pre>';
    print_r($nice_array);
    echo '</pre>';

这是有效的,我只需要反思 foo_foo_label 的事情,一切都很好

【问题讨论】:

  • datedate_modif 怎么样?
  • 如果这不会变得过于递归,那么可能值得查看preg_grep 的 PHP 文档中的 cmets - 特别是在匹配键时:php.net/manual/en/function.preg-grep.php
  • array_walk 不允许您添加、取消设置或更改数组的顺序
  • @danjam 这很正常。但是由于取消设置所有值都很好,所以我坚持如果...而不是:(

标签: php arrays


【解决方案1】:

您可以在数组键上使用explode,如下所示:

$newArray = array();
foreach ( $array as $key => $value )
{
    $parts = explode('_', $key);
    $newArray[$parts[0]][$parts[1]] = $value; 
}

编辑:更新,详见 cmets。将处理您的foo_foo_value 案件以及foofoo_foo。如果您只是将结果传递给第二个数组,那么真的没有理由使用 array_walk。

$newArray = array();
foreach ( $array as $key => $value ) {
  if ( preg_match('/_(label|value|unit)$/', $key) === 0 ) {
    $newArray[$key] = $value;
    continue;
  }
  $pos = strrpos($key, '_');
  $newArray[substr($key, 0, $pos)][substr($key, $pos+1, strlen($key))] = $value;
}

【讨论】:

  • 注意数组的键必须是以下格式:xxx_yyy.
  • 这是我最初的想法,但我认为 php 有一种更优雅的方式来处理这个问题
  • @OfirBaruch 非常正确,只是注意到 OP 的密钥不是那种格式。
  • @Su4p 你想完全忽略这些元素还是必须保持不变?
  • @danjam 这个方法的问题是如果我有 foo_foo_value。
【解决方案2】:

您可以做的是遍历数组,然后拆分 (explode()) _ 上的每个键以构建您的新数组。

$newArray = array();
foreach($oldArray as $key=>$value){
    list($name, $subName) = explode('_', $key);

    if($subName !== NULL){
        if(!isset($newArray[$name])){
            $newArray[$name] = array();
        }
        $newArray[$name][$subName] = $value;
    }
    else{
        $newArray[$name] = $value;
    }
}

【讨论】:

    【解决方案3】:
        $nice_array = array();
        array_walk($array, function($val, $key) use(&$nice_array) {
            $match = false;
            preg_match("/_label|_value|_unit|_libelle/", $key, $match);
            if (count($match)) {
                $tname = preg_split("/_label$|_value$|_unit$|_libelle$/",$key);
                $name = $tname[0];
                $subName = substr($match[0],1);
                $nice_array[$name][$subName] = $val;
            } else {
                $nice_array[$key] = $val;
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2021-08-14
      • 2020-08-13
      • 2018-08-15
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 2013-11-17
      相关资源
      最近更新 更多