multidimensional Array same value remove array - php

Hello everyone i'm struggling with a issue and couldn't really find my answer on the web.
Maybe i made a mistake than sorry but the answers i found where not exactly where i where searching for.
Here is my problem
["acList"]=>
array(356) {
[0]=>
array(36) {
["Id"]=>
int(434367)
["Rcvr"]=>
int(154)
["HasSig"]=>
bool(true)
["Sig"]=>
int(19)
["Icao"]=>
string(6) "06A0BF"
["Bad"]=>
bool(false)
["Reg"]=>
string(6) "A7-BDA"
["FSeen"]=>
string(21) "/Date(1509481499558)/"
}
[1]=>
array(43) {
["Id"]=>
int(3753696)
["Rcvr"]=>
int(149)
["HasSig"]=>
bool(true)
["Sig"]=>
int(23)
["Icao"]=>
string(6) "3946E0"
["Bad"]=>
bool(false)
["Reg"]=>
string(6) "A7-BDA"
["FSeen"]=>
string(21) "/Date(1509481476453)/"
}
I want that when "Reg" is the same that he removes only one of the same arrays (if possible based on FSeen).
I tried to make new array and combine them and i tried array_unique but that is not doing what i want sadly.
I hope someone can help me out with this.

Its not going to be the most efficient way, or great for large data sets, but this could work:
$aArray = array(array('id' => 1), array('id' => 2), array('id' => 1));
// create a tmp array to hold values we want to check
$aTmpArray = array();
// loop over the array
foreach ($aArray as $iPos => $aItem) {
if(!isset($aTmpArray[$aItem['id']])){
// if the item doesnt exist in tmp array, add it
$aTmpArray[$aItem['id']] = null;
}else{
// if the item exists, remove this entry from aArray
unset($aArray[$iPos]);
}
}
// set for gc
$aTmpArray = null;
It will preserve the first result and remove any subqiquent duplicates/occurances of id.

Related

foreach results in endless loop

I have an array stored in $_SESSION:
var_dump($_SESSION['session_article']);
//result:
array(2) {
[0]=> array(2) {
["id"]=> string(1) "3"
["amount"]=> int(2)
}
[1]=> array(2) {
["id"]=> string(2) "13"
["amount"]=> int(1)
}
}
If I do:
for($artKey = 0;$artKey < count($_SESSION['session_article']);$artKey++){
$cartArt = $_SESSION['session_article'][$artKey];
//stuff that doesn't affect key or value
}
everything is fine ...but if I do:
foreach($_SESSION['session_article'] as $artKey => $cartArt){
//stuff that doesn't affect key or value
}
the page won't stop to load (infinite loading, like the foreach never terminates)
I would like to you know that the computer is not a dumb machine, so whenever you do not get the right result then its not the computers problem, it is in how you code.
So lets take a look at your code first you var_dump($_SESSION['session_article']) you got an array with two elements each being an associative array. Now observe that this is an array of arrays so you code in scenario 2 is wrong.
If it were to be just a single array say $myArray = ['Simon', 'Peter', 'You'] then this woul have worked fine (note I used the short array syntax here you can use array() if you prefer). But the problem is you have multidimensional Arrays so you could should be
foreach($_SESSION['session_article'], list($a,))
{
//stuffs here
}
or better walk through the $_SESSION['session_article'] as an associative array like so
$myArray = $_SESSION['session_article']
$field = count($myArray, COUNT_RECURSIVE - (int)2)
for ($record = 0; $record < $myArray.length; $record++) {
//record number
for ($field = 0; $field < $field ; $field++) {
//combine record and field here
}
}
Hope I could lend a helping hand?
Please checkout
http://php.net/manual/en/function.count.php
http://php.net/manual/en/control-structures.foreach.php
They really have a good doc, just take you time.

php array loop to get array

I have a $date array like this:
[1]=> array(11) {
["meetingname"]=> string(33) "win2008connectcurrent0423131"
[0]=> array(3) {
["scoid"]=> string(7) "3557012"
["datecreated"]=> string(19) "2013-05-23 10:02:39"
["numparticipants"]=> string(1) "3"
}
[1]=> array(3) {
["scoid"]=> string(7) "3557012"
["datecreated"]=> string(19) "2013-05-23 14:40:06"
["numparticipants"]=> string(1) "3"
}
}
foreach($date[0] as $key => $meetings){
print "$key = $meetings\n";////yields scoid = 3557012
}
And, as you can see above, I am looping over individual elements. The first element (not indexed) is always meetingname; the rest of the elements are indexed and themselves contain arrays with three elements in each array--in the above code they are [0] and [1].
What I need to do is make the $meetings as an array containing [0] and then [1] etc, depending on the number of elements. So essentially, the output for print should be an array (I can also use var_dump) with key/values of [0] but right not it only outputs individual keys and their values, for example, as you can see above, scoid=3557012. I will need, something all keys/values in the $meetings variable, something like:
{
["scoid"]=> string(7) "3557012"
["datecreated"]=> string(19) "2013-05-23 10:02:39"
["numparticipants"]=> string(1) "3"
}
How can I fix the foreach loop for that?
please Try this. hope it help.
foreach($date as $key => $meetings){
if($key == "meetingname")
continue;
else
print "$meetings\n";
}
You can just create a new array and add the meetings to that one
<?php
$meetings = array();
foreach($date[1] as $key=>$meeting) {
if (!is_int($key))
continue; //only handle numeric keys, incase you ever change the name of the first key 'meetingname'
$meetings[] = $meeting
}
var_dump($meetings);
?>

PHP shuffle not working like expected on my nested array

I have a nested array of arrays, and I want to shuffle the inner arrays. My code looks like this (simplified):
$a = array(array('banana', 'peach'), array('ding', 'dong'), array('oh snow'));
foreach ($a as &$arr) {
shuffle($arr);
}
var_dump($a);
The var_dump outputs this:
array(3) { [0]=> array(2) { [0]=> string(5) "peach" [1]=> string(6) "banana" } [1]=> array(2) { [0]=> string(4) "ding" [1]=> string(4) "dong" } [2]=> &array(1) { [0]=> string(7) "oh snow" } }
As you can see in the output, the first two subarrays work, but the third subarray is linked by reference in the output...
In my full app, this last array-link causes problems, but rather than working around the issue, I want to fix this shuffle thing...
Cheers!
This has to do with how PHP stores references to array elements. It cannot reference an element of an array, only values. Therefore it has to store the value array('oh snow') in a "slot" of the symbol table, then make $arr and $a[2] a reference to that value.
To fix this, unset($arr) after the loop. That way only a single variable is referencing the value, which will then be made a regular array index again. Unsetting references after a foreach is good practice anyway, since there are many such gotchas.

PHP Array_intersect on multidimensional array with unknown number of keys

I'm trying to make advanced search filters in an application that holds resources (people). I've got all the results in 1 multidimensional array. A user of the application can search for the persons Job title, skills, work field and country.
I've already made the part where I look up the people that meet the criteria given by the user. These results are stored in a multidimensional array. If the user is looking for someone with a specific resource with a job title and a specific skill the return value is this:
$realfilters = array(2) {
["resourcesWithJobtitle"]=> array(6) {
[0]=> string(1) "1"
[1]=> string(2) "48"
[2]=> string(2) "88"
}
["resourcesWithSkill"]=> array(9) {
[0]=> string(1) "4"
[1]=> string(1) "8"
[2]=> string(1) "48"
[3]=> string(2) "50"
}
When the user also looks for a work field this is added to the result:
["resourcesWithWorkfield"]=> array(3) {
[0]=> string(2) "48"
[1]=> string(2) "96"
[2]=> string(2) "97"
}
I need to know which resources meet all dimensions of the array so I can display them. (So in this example I need an array with just 1 value: 48). I think I need to use array_intersect but can't seem to get it right.
One of the possible solutions: you may first extract() the $realfilters array values to variables, and then apply the array_intersect() to them. But this solution is applicable only if there are not many possible filters.
Another one and probably the best solution would be to intersect in a loop, something like:
$res_arr = array_shift($realfilters);
foreach($realfilters as $filter){
$res_arr = array_intersect($res_arr, $filter);
}
$intersection = call_user_func_array('array_intersect', $array);
That will give you the elements present in all the sub arrays of $array.
edit-
This above is like a shortcut for writing:
$intersection = array_intersect($array['a'], $array['b'], ...and so on for all elements...);
A loop could be used as well
$intersection = reset($array);
foreach ($array as $subarr) {
$intersection = array_intersect($intersection, $subarr);
}
print_r($intersection);

using array_search() to find values in php

Im trying to search a array and navigate to the next and previous values
$ids=$res->result_array();
returns
array(3) {
[0]=>
array(1) {
["qid"]=>
string(5) "63697"
}
[1]=>
array(1) {
["qid"]=>
string(5) "63706"
}
[2]=>
array(1) {
["qid"]=>
string(5) "63709"
}
}
but when i try to search for the index it returns false
$curr_index = array_search($this->uri->segment(4), $q);
returns
bool(false)
$this->uri->segment(4) is the qid.
i want to navigate with the array by increasing and decreasing by one so i can get the next and previous values.
can someone please tell what am i doing wrong here?
You have an array of arrays, you could search it like this:
$curr_index = array_search(array('qid' => $this->uri->segment(4)), $q);
Where you are actually searching for an array instead of a string.
Working example: http://codepad.viper-7.com/Ff0sAq

Categories