Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

I have a PHP array that I am trying to split into 2 different arrays. I am trying to pull out any values that contain the word "hidden". So one array would contain all the values that do not contain the word "hidden". The other array would contain all the values that do contain the word "hidden". I just can't figure out how to do it though.

The original array is coming from a form post that contains keys and values from a bunch of check boxes and hidden inputs. so the actual post value looks something like this:

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

so to simplify it:

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

final output

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

Anyone know how to do something like this?

share|improve this question
add comment

6 Answers

You can use array_filter() function:

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

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

Demo

share|improve this answer
    
Need to be === false; instead of == false; –  Narek Nov 20 '13 at 14:24
1  
@Narek: tnx, fixed. –  Glavić Nov 20 '13 at 14:27
add comment

This should do the trick:

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

foreach ($myArray as $key => $value) {
    if (strpos($value, "hidden") !== false) {
        $secondaryArray[] = $value;
        unset($myArray[$key]);
    }
}

It moves all the entries that contain "hidden" from the $myArray to $secondaryArray.

Note: It's case sensitive

share|improve this answer
add comment
$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;
    }
}

This solution checks if 'hidden' present at current item, if no, move to $arr1 else to $arr2

share|improve this answer
add comment

You can use 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);
share|improve this answer
add comment

You can use array_filter to filter out elements.

function filterCallback($val) {
    return strpos($val, 'hidden');
}
$subArray = array_filter($array, 'filterCallback');
$subArray2 = array_diff($array, $subArray);

Or, if you have PHP 5.3+, you can use closures.

$subArray = array_filter($array, function($val) { return strpos($val, 'hidden'); });
$subArray2 = array_diff($array, $subArray);
share|improve this answer
add comment

Maybe it's just me, but I would go for the clarity of regular expressions...

foreach($myArray as $item) {
    if (preg_match("/hidden$/i", $item)) {
        array_push($arr2, $item);
    } else {
        array_push($arr1, $item);
    }
}
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.