有更好的方法来按键从某些字符串开始拆分数组吗?

时间:2019-05-24 08:03:22

标签: php arrays

我有例如数组

$myArray = [
    'id' => 1,
    'code' => '1234',
    'translation_lang_id' => 3,
    'translation_name' => 'Lorem Ipsum',
    'translation_description' => 'My content'
];

现在,我需要将其分为:首先是所有键和值,其中键以translation_开头,其次是其余键,因此最终看起来应该像这样:

$translationArray = [
    'translation_lang_id' => 3,
    'translation_name' => 'Lorem Ipsum',
    'translation_description' => 'My content'
];

$baseData = [
    'id' => 1,
    'code' => '1234',
];

有比循环更好的方法吗?

5 个答案:

答案 0 :(得分:4)

您可以将array_filterARRAY_FILTER_USE_KEY标志一起使用,以根据键是否以'translation_'开头来分隔不同的元素:

$translationArray = array_filter($myArray, 
                                 function ($k) { 
                                     return substr($k, 0, 12) == 'translation_'; 
                                 }, ARRAY_FILTER_USE_KEY);
$baseData = array_filter($myArray, 
                         function ($k) { 
                             return substr($k, 0, 12) != 'translation_'; 
                         }, ARRAY_FILTER_USE_KEY);

var_export($translationArray);
var_export($baseData);

输出:

array ( 
  'translation_lang_id' => 3,
  'translation_name' => 'Lorem Ipsum',
  'translation_description' => 'My content', 
)
array (
  'id' => 1,
  'code' => '1234',
)

Demo on 3v4l.org

答案 1 :(得分:4)

一种蛮力方法是仅迭代您的数组,然后将元素分配给适当的目标数组:

$translationArray = array();
$baseData = array();

foreach ($myArray as $key => $value) {
    if (preg_match("/^translation_/", $key)) {
        $translationArray[$key] = $value;
    }
    else {
        $baseData[$key] = $value;
    }
}

答案 2 :(得分:2)

您可以拔出您想要的一个键值,然后对原始数组进行差分以得到另一个。

<?php

$input = [
    'id' => 1,
    'code' => '1234',
    'translation_lang_id' => 3,
    'translation_name' => 'Lorem Ipsum',
    'translation_description' => 'My content'
];

$translation = array_filter($input, function($k) {
    return strpos($k, 'translation_') === 0;
}, ARRAY_FILTER_USE_KEY);

$base = array_diff_key($input, $translation);

var_dump($translation, $base);

输出:

array(3) {
    ["translation_lang_id"]=>
    int(3)
    ["translation_name"]=>
    string(11) "Lorem Ipsum"
    ["translation_description"]=>
    string(10) "My content"
  }
  array(2) {
    ["id"]=>
    int(1)
    ["code"]=>
    string(4) "1234"
  }

但是循环可能更易于阅读和遵循:

foreach($input as $k=>$v)
    strpos($k, 'translation_') === 0 
        ? $translation[$k]=$v 
        : $base[$k]=$v;

答案 3 :(得分:2)

Demo Link

搜索任何用str替换的字符串,并分批获取数据,

$str              = "translation_";
$len              = strlen($str); // upto length for fetching sub string
$translationArray = $baseData = [];
foreach ($input as $key => $value) {
    if (substr($key, 0, $len) == $str) { // checking here
        $translationArray[$key] = $value;
    } else {
        $baseData[$key] = $value;
    }
}

答案 4 :(得分:1)

这不是一种有效的方法,只是为了好玩。
这是一个班轮:-)

$baseData = array_diff_key($myArray, $translationArray = array_intersect_key($myArray,array_flip(preg_grep("/^translation/", array_keys($myArray)))));

它在键上使用preg_grep,然后将它们与主数组中的array_intersect相匹配。
然后从$ translationArray将$ baseData创建为array_diff_key。

https://3v4l.org/HE5vK