将PHP数组根据值拆分为两个数组

19

我有一个PHP数组,我尝试将其拆分为两个不同的数组。我试图提取任何包含“hidden”单词的值。因此,一个数组将包含不包含“hidden”单词的所有值。另一个数组将包含所有包含“hidden”单词的值。我只是无法弄清楚如何做到这一点。

原始数组来自表单提交,其中包含来自一堆复选框和隐藏输入框的键和值。因此,实际提交的值看起来像这样:

Group1 => Array([0] => item1,[1] => item2hidden,[2] => item3,[3] => item4,[4] => item5hidden)

所以为了简化它:

$myArray = Array(item1, item2hidden, item3, item4, item5hidden)

最终输出

$arr1 = (item1, item3, item4)
$arr2 = (item2hidden, item5hidden)

有人知道如何做类似这样的事情吗?

5个回答

30

你可以使用array_filter()函数:

$myArray = array('item1', 'item2hidden', 'item3', 'item4', 'item5hidden');

$arr1 = array_filter($myArray, function($v) { return strpos($v, 'hidden') === false; });
$arr2 = array_diff($myArray, $arr1);

需要使用 === false; 而不是 == false; - Narek
如果您的初始数组中包含数组值,则无法正常工作。例如,$myArray = [['id' => 1], ['id'] => 2]; - andnik
@andnik:只需将 strpos($v, ... 替换为 strpos($v['id'], ... - Glavić
@Glavić,谢谢,但我指的是第二部分。当您使用多维数组时,array_diff无法正常工作。这个链接似乎包含了我正在寻找的答案:https://dev59.com/OGgt5IYBdhLWcg3wxAVj - andnik

10

这应该就可以解决问题:

$myArray = array('item1', 'item2hidden', 'item3', 'item4', 'item5hidden');
$secondaryArray = array();

foreach ($myArray as $key => $value) {
    if (strpos($value, "hidden") !== false) {
        $secondaryArray[] = $value;
        unset($myArray[$key]);
    }
}
它将所有包含“hidden”的条目从$myArray移动到$secondaryArray中。

注意:它区分大小写。


注意:它区分大小写。


0
$myArray = Array('item1', 'item2hidden', 'item3', 'item4', 'item5hidden');
$arr1 = array();
$arr2 = array();    
foreach ($myArray as $item) {
    if (strpos($item, "hidden") !== false) {
        $arr1[] = $item;
    } else {
        $arr2[] = $item;
    }
}

此解决方案检查当前项目是否存在“hidden”,如果不存在,则移动到$arr1,否则移动到$arr2


0

你可以使用 array_filter:

function filtreHiddens($e) {
    if (isset($e['hidden']) && $e['hidden']) return true;
    else return false;
}

function filtreNotHiddens($e) {
    if (isset($e['hidden']) && !$e['hidden']) return true;
    else return false;
}

$arrayToFiltre = array(
    array('hidden' => true, 'someKey' => 'someVal'),
    array('hidden' => false, 'someKey1' => 'someVal1'),
    array('hidden' => true, 'someKey2' => 'someVal3'),
);

$hidden = array_filter($arrayToFiltre, 'filtreHiddens');
$notHidden = array_filter($arrayToFiltre, 'filtreNotHiddens');

print_r($hidden);
print_r($notHidden);

0
也许只有我这么认为,但我会选择正则表达式的清晰度...
foreach($myArray as $item) {
    if (preg_match("/hidden$/i", $item)) {
        array_push($arr2, $item);
    } else {
        array_push($arr1, $item);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接