如何从其他关联数组创建关联数组?

时间:2015-04-09 12:27:43

标签: php arrays string algorithm associative-array

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

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

例如:
- 循环通过以下阵列&推送所有具有以&#34开头的键的元素;可食用_"到输出数组:

$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);

第二: 我该如何删除"食用_"从输出数组的键?有了这第二位,我不知道从哪里开始!

第三: 我已经设法在你的帮助下找到了上述内容,谢谢!现在我只需要了解如何在一个带有日期和时间的新行上打印每个元素。每行末尾的时间戳?我有这个(似乎没有工作):

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

5 个答案:

答案 0 :(得分:3)

您的第一个代码将有效。

要从密钥中删除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;
    }
}

答案 1 :(得分:1)

这将是我的方法:

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
)

答案 2 :(得分:1)

首先:是的,这会奏效,但我会稍微改写一下:

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

关于 Second :您正在询问如何从输出数组中删除密钥。但是,您甚至没有将密钥推入输出数组,只推送了该值。如果您还想按键,您应该这样做:

$result[$key] = $value;

但是既然你没有这样做,就没有必要删除密钥。

但是,如果你想从$assoc_array删除密钥的可食部分,你只需要在循环中添加一行,并通过添加&引用来传递密钥。 :

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

编辑:正如OP在评论中告诉我的那样,她想要在没有可食用部分的情况下推动钥匙。所以就这样做:

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

答案 3 :(得分:1)

您可以遍历数组并搜索密钥是否包含您可以删除的字符串并生成$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

答案 4 :(得分:1)

这应该适合你:

首先,我删除所有在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 )