Jump to content

Deleting specific array members


jimfog

Recommended Posts

I have a multidimensional array...it goes like this:

array(112) {
  [0]=>
  array(4) {
["title"]=>
string(8) "11:00:00"
["day"]=>
string(6) "friday"
["date"]=>
string(10) "2015-12-04"
["time"]=>
string(8) "11:00:00"
      }
      [1]=>
array(4) {
["title"]=>
string(8) "11:30:00"
["day"]=>
string(6) "friday"
["date"]=>
string(10) "2015-12-04"
["time"]=>
string(8) "11:30:00"
}
[2]=>
array(4) {
["title"]=>
string(8) "12:00:00"
["day"]=>
string(6) "friday"
["date"]=>
string(10) "2015-12-04"
["time"]=>
string(8) "12:00:00"
}

[3]=>
  array(4) {
["title"]=>
string(8) "12:30:00"
["day"]=>
string(6) "friday"
["date"]=>
string(10) "2015-12-04"
["time"]=>
string(8) "12:30:00"
  }
  [4]=>
  array(4) {
["title"]=>
string(8) "09:00:00"
["day"]=>
string(6) "monday"
["date"]=>
string(10) "2015-12-07"
["time"]=>
string(8) "09:00:00"
  }

it lists the weekdays covering an entire month...every day corresponding to a date and for title I have times(I know this is misleading but I cannot explain now the story behind it)

The goal:
For each weekday I want to delete the last array member

Let me explain:
In the example above Friday is mentioned for times 11:00...11:30...12:00...12:30...I just want to delete the array member for 12:30....leaving times 11:00...11:30....12:00.

It has to be a loop..but apart from that I do not know how to proceed....

Link to comment
Share on other sites

This array structure is not ideal for that situation. You're going to have to first construct a temporary data structure to point to the data you want to delete.

$existing = [The array you currently have]

/* Step 1. Create a new data structure */
$temp = array();
foreach($existing as $index => $data) {
  // A key to group times from the same date
  $key = $data['date'];

  // A timestamp to measure which dates are more recent
  $timestamp = strtotime($data['date'] . ' ' $data['time']);

  // If there aren't any times for this date yet, store this one
  if(!isset($temp[$key])) {
    $temp[$key] = array(
      'index' => $index,
      'timestamp' => $timestamp
    );

  // If the largest stored time for this date is earlier than the time of the current element then store the current element 
  } else if($temp[$key]['timestamp'] < $timestamp) {
    $temp[$key]['index'] = $index;
    $temp[$key]['timestamp'] = $timestamp;
  }
}

/* Step 2. Delete items based on the new data structure */
foreach($temp as $value) {
  $index = $value['index'];
  unset($existing[$index]);
}

/* Step 3. Remove gaps left by unset() */
$existing = array_values($existing);

This kind of task, though, seems ideal for a database to do rather than putting the work on PHP. Databases are highly optimized for searching and manipulating data like this.

Link to comment
Share on other sites

This kind of task, though, seems ideal for a database to do rather than putting the work on PHP. Databases are highly optimized for searching and manipulating data like this.

First of all....the array you see above is taken out of a database...either way.

To understand better:

All these times/days you see represent the schedule of a business(hair salon for example)...ex.Friday, from 10:00-15:00.

From this schedule the available appointments slots are shown to the user...which of course must fall within this time frame.

 

The only problem is that the last time must not be shown to the user since at that time the store closes and it is not considered an available time-slot.

 

That is why I want to remove the last time segment from each day....I have not found a way to do it in the DB level(with a query)...as such I am trying to do it using application code.

Link to comment
Share on other sites

Then you want the specific time of 15:00 removed NOT the last?, unless all booking times from 10:00 to 15:00 are included wether filled or empty then you would just remove the last, but your array does not show this?

Edited by dsonesuk
Link to comment
Share on other sites

Then you want the specific time of 15:00 removed?,

Exactly...the user must not have the option selecting 15:00...that is why I must remove it from the array.

Link to comment
Share on other sites

As mention post#1 array is detailed description of array when using var_dump() for example.

 

if you have array outputted as

        $whatever = [
            0 =>
            ['title' => "11:00:00",
                "day" => "friday",
                "date" => "2015-12-04",
                "time" => "11:00:00"
            ],
            1 =>
            ["title" => "11:30:00",
                "day" => "friday",
                "date" => "2015-12-04",
                "time" => "11:30:00"
            ],
            2 =>
            ["title" => "12:00:00",
                "day" => "friday",
                "date" => "2015-12-04",
                "time" => "12:00:00"
            ],
            3 =>
            ["title" => "12:30:00",
                "day" => "friday",
                "date" => "2015-12-04",
                "time" => "12:30:00"
            ],
            4 =>
            ["title" => "09:00:00",
                "day" => "monday",
                "date" => "2015-12-07",
                "datex" => "2015-12-07",
                "time" => "09:00:00"
            ],
            5 =>
            ["title" => "10:00:00",
                "day" => "monday",
                "date" => "2015-12-07",
                "datex" => "2015-12-07",
                "time" => "10:00:00"
            ]
        ];

you can then loop through each 'time' index/key to search for main index/key to remove.

        $timeToRemove = "12:30:00";
         //$count=0;
        foreach ($whatever as $key => $row) {
            if ($row['time'] == $timeToRemove) {
                echo 'found ' . $row['time'] . ' & index/key: ' . $key . ' now unset the main key<br>';
                unset($whatever[$key]);
            }
            echo $row['time'] . ' before<br>';
            //$count++;
        }
        $whatever = array_values($whatever); //update $whatever to current set elements/values in array
        echo '<hr>';
        foreach ($whatever as $row) {
            echo $row['time'] . ' after<br>';
        }

Edit: rethink in case array is not in order, or array key does start with 0 etc compared with $count value, by finding actual key/index value and using that.

Edited by dsonesuk
Link to comment
Share on other sites

This array structure is not ideal for that situation. You're going to have to first construct a temporary data structure to point to the data you want to delete.

$existing = [The array you currently have]

/* Step 1. Create a new data structure */
$temp = array();
foreach($existing as $index => $data) {
  // A key to group times from the same date
  $key = $data['date'];

  // A timestamp to measure which dates are more recent
  $timestamp = strtotime($data['date'] . ' ' $data['time']);

  // If there aren't any times for this date yet, store this one
  if(!isset($temp[$key])) {
    $temp[$key] = array(
      'index' => $index,
      'timestamp' => $timestamp
    );

  // If the largest stored time for this date is earlier than the time of the current element then store the current element 
  } else if($temp[$key]['timestamp'] < $timestamp) {
    $temp[$key]['index'] = $index;
    $temp[$key]['timestamp'] = $timestamp;
  }
}

/* Step 2. Delete items based on the new data structure */
foreach($temp as $value) {
  $index = $value['index'];
  unset($existing[$index]);
}

/* Step 3. Remove gaps left by unset() */
$existing = array_values($existing);

This kind of task, though, seems ideal for a database to do rather than putting the work on PHP. Databases are highly optimized for searching and manipulating data like this.

The above code seems to do the job...thanks.

Link to comment
Share on other sites

You do realise it removes the last appointment for every day, NOT just 12:30, OR 15:00, which is what we establish in post #5 that you just wanted 12:30 in post#1, or 15:00 in post #3 ONLY. if appointment for 10:00 and 10:30 only existed, then 10:30 would be removed.

 

Edit: actually you will see that Monday appointment at 9:00 no longer exist within array being the only appointment on that day and therefore becomes the last, have i misunderstood this?

Edited by dsonesuk
Link to comment
Share on other sites

You do realise it removes the last appointment for every day...

 

I do realize that and this is what I want...sorry if I was not able to make it clear from the beginning.

Link to comment
Share on other sites

  • 3 weeks later...

Only partially removes elements from multiple association array, key index will remain with empty associated values, meaning it will show empty value for key index because you are not unseting array element thrn removing it but just clearing just some parts of it.

Edited by dsonesuk
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...