【问题标题】:How to make a associative array from other associative array?如何从其他关联数组制作关联数组?
【发布时间】:2015-04-09 12:27:42
【问题描述】:

我需要一些帮助来解决我正在处理的另一个 PHP 问题。我不会发布确切的问题,因为我更愿意尝试应用我从这里获得的知识来解决我的问题。

第一: 我有一个关联数组。我必须遍历数组以找到键以特定字符串开头的数组值,并将键和值都推送到输出数组。

例如:
- 遍历下面的数组并将所有以“edible_”开头的键的元素推送到输出数组:

$assoc_array = array(
    'edible_fruit' => 'apple',
    'animal' => 'cat',
    'edible_veg' => 'pumpkin',
    'number' => '23',
    'city' => 'Cape Town',
    'edible_berry' => 'blueberry',
    'color' => 'blue'
);

这行得通吗?

$result = array();

foreach ($assoc_array as $key => $value) {
    if (substr($key, 0, 7) == "edible_") {
        array_push($result, $value);
    }
}

print_r($result);

第二: 如何从输出数组的键中删除“edible_”?有了这第二点,我什至不知道从哪里开始!

第三: 在您的帮助下,我设法弄清楚了上述问题,谢谢!现在我只需要找出如何在新行上打印每个元素,并在每行末尾添加日期和时间戳?我有这个(似乎没有工作):

while (list($key, $value) = each($output)) {
    print_r("$key => $value" . date("y/m/d G.i:s", time()) . "<br>");
}

【问题讨论】:

  • “这行得通吗?” - 为什么不试试呢?我觉得不错。
  • 要从键中删除字符串,您可以使用str_replace()preg_replace()。第一个将替换字符串中的任何位置,第二个使用正则表达式,因此您可以根据需要将替换锚定到字符串的开头。
  • 我正在尝试这个,但它似乎根本没有打印任何东西。输出保持空白:-/
  • Works for me - 你是在控制台还是在 Apache 中运行它?
  • 那么这个问题我们在哪里呢?下面的一个答案解决了您的问题吗?

标签: php arrays string algorithm associative-array


【解决方案1】:

您的第一个代码将起作用。

要从密钥中删除edible_,您可以使用explode() -

$keyParts = explode('_', $key);
$newKey = $keyParts[1];

您必须将新键添加到数组中,而您现在没有这样做。

foreach ($assoc_array as $key => $value) {
    if (substr($key, 0, 7) == "edible_") {
        $keyParts = explode('_', $key);
        $newKey = $keyParts[1];
        $result[$newKey] = $value;
    }
}

【讨论】:

    【解决方案2】:

    这将是我的方法:

    foreach($assoc_array as $key => $value) {
        if(preg_match("/^edible_/",$key)) {
            $result[preg_replace("/^edible_/","",$key)] = $value;
        }
    }
    

    使用preg_match 检查密钥是否以您要查找的内容开头,并使用preg_replace 从密钥的开头(^)删除字符串:)

    输入($assoc_array):

    Array
    (
        [edible_fruit] => apple
        [animal] => cat
        [edible_veg] => pumpkin
        [number] => 23
        [city] => Cape Town
        [edible_berry] => blueberry
        [color] => blue
    )
    

    输出($result):

    Array
    (
        [fruit] => apple
        [veg] => pumpkin
        [berry] => blueberry
    )
    

    【讨论】:

      【解决方案3】:

      首先:是的,这会起作用,但是我会稍微重写一下:

      foreach ($assoc_array as $key => $value) {
          if (strpos($key, 'edible_') === 0) {
              $result[] = $value;
          }
      }
      

      关于第二:您正在询问如何从输出数组中删除键。但是,您甚至没有将键推入输出数组,而只是将值推入。如果你也想按下按键,你应该这样做:

      $result[$key] = $value;
      

      但由于您还没有这样做,因此无需删除密钥。

      但是,如果您的意思是从 $assoc_array 中删除密钥的 edible_ 部分,您只需在循环中添加一行并通过添加 &amp; 通过引用传递密钥:

      foreach ($assoc_array as &$key => $value) {
          if (strpos($key, 'edible_') === 0) {
              $key = str_replace('edible_', '', $key)
              $result[] = $value;
          }
      }
      

      编辑:正如 OP 在 cmets 中告诉我的,她想按下没有可食用部分的钥匙。所以就这样做吧:

      foreach ($assoc_array as $key => $value) {
          if (strpos($key, 'edible_') === 0) {
              $key = str_replace('edible_', '', $key)
              $result[$key] = $value;
          }
      }
      

      【讨论】:

      • 0 不是 strpos
      • 感谢您的建议!我现在注意到我没有按下钥匙,我不知道该怎么做。最终输出仍然有一个键和值,但不是“edible_fruit”,而是“fruit”,如果这有意义的话?
      【解决方案4】:

      这应该适合你:

      首先,我删除所有元素,这些元素在带有array_diff_ukey() 的键的开头没有edible_。在此之后,我只需 array_combine() 带有它们的键的元素,其中我删除带有 array_map()substr() 的前缀。

      <?php
      
          $assoc_array = array('edible_fruit'=>'apple', 'animal'=>'cat', 'edible_veg'=>'pumpkin', 'number'=>'23', 'city'=>'Cape Town', 'edible_berry'=>'blueberry', 'color'=>'blue');
      
          //remove elemnts
          $result = array_diff_ukey($assoc_array, ["edible_" => ""], function($k1, $k2){
              return substr($k1, 0, 7) == $k2;
          });
      
          //change keys
          $result = array_combine(
                      array_map(function($v){
                          return substr($v, 7);
                      }, array_keys($result)),
                  $result);
      
          print_r($result);
      
      ?>
      

      输出:

      Array ( [fruit] => apple [veg] => pumpkin [berry] => blueberry )
      

      【讨论】:

        【解决方案5】:

        您可以遍历数组并搜索键是否具有您可以消除的字符串并使您的$newArray

        <?php
        
        $assoc_array = array('edible_fruit'=>'apple', 'animal'=>'cat', 'edible_veg'=>'pumpkin', 'number'=>'23', 'city'=>'Cape Town', 'edible_berry'=>'blueberry', 'color'=>'blue');
        
        $search = 'edible_';
        $newArray = array();
        
        #First and Second Step
        foreach($assoc_array as $key => $value) {
            if(strpos($key, "edible_") === 0) {
                $newArray[substr($key, 7)] = $value;
            }
        }
        
        
        print_r($newArray);
        
        echo "<br>\n";
        
        #Third Step
        foreach($newArray as $key => $value) {
            echo "$key => $value " . date("y/m/d G.i:s", time()) . "<br>\n"; 
        }   
        

        输出:

        #First and Second Step
            Array ( [fruit] => apple [veg] => pumpkin [berry] => blueberry )
        
        #Third Step    
            fruit => apple 15/04/10 3.02:16
            veg => pumpkin 15/04/10 3.02:16
            berry => blueberry 15/04/10 3.02:16
        

        【讨论】:

        • 哎呀!试试inedible_mushroom的键?
        • @AlliePascoal 你测试我的答案,你有一些进步吗?
        猜你喜欢
        • 1970-01-01
        • 2018-11-29
        • 2019-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        • 2016-07-03
        相关资源
        最近更新 更多