Jump to content
jimfog

Deleting specific array members

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....

Share this post


Link to post
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.

Share this post


Link to post
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.

Share this post


Link to post
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

Share this post


Link to post
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.

Share this post


Link to post
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

Share this post


Link to post
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.

Share this post


Link to post
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

Share this post


Link to post
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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...