Reputation: 1627
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?
Upvotes: 19
Views: 41322
Reputation: 43552
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);
Upvotes: 30
Reputation: 103
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);
}
}
Upvotes: 0
Reputation: 373
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);
Upvotes: 0
Reputation: 8879
$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
Upvotes: 0
Reputation: 9920
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
Upvotes: 10