Jump to content

Remove related element from multidimensional array


Go to solution Solved by Barand,

Recommended Posts

This is my array. It has stored images data.

[other-image] => Array
  (
    [img] => Array
        (
            [0] => 1526973657.jpg
            [1] => 1526973661.jpg
            [2] => 1526973665.jpg
        )

    [path] => Array
        (
            [0] => ../post-upload/1/
            [1] => ../post-upload/1/
            [2] => ../post-upload/1/
        )

    [type] => Array
        (
            [0] => 1
            [1] => 1
            [2] => 1
        )

    [thumb] => Array
        (
            [0] => thumb_1526973661.jpg
            [1] => thumb_1526973665.jpg
            [2] => thumb_1526973668.jpg
        )

  )

Now I want to delete an image and it's all related data from sub arrays. (path, type, thumb data) 

 

This is how I tried it in php:

  $delkey = $_POST['key'];
  if(in_array($delkey, $_SESSION['other-image']['img'])){
      $imgkey = array_search($delkey, $_SESSION['other-image']['img']);
      if($imgkey) unset($_SESSION['other-image']['img'][$imgkey]);

      //file path
      $fp = UPLOAD_DIR.$nextId."/".$delkey;
      unlink($fp);  
  }

As I did, its only deleting element form 'img' array, but I want to delete related data from other arrays too.

 

Can anybody tell me how to do this?

 

Thank you.

Is this what you mean

$delkey = $_POST['key'];
  if(in_array($delkey, $_SESSION['other-image']['img'])){
      $imgkey = array_search($delkey, $_SESSION['other-image']['img']);
      if($imgkey) {
          foreach (['img', 'path', 'type', 'thumb'] as $sub) {
              unset($_SESSION['other-image'][$sub][$imgkey]);
          }
      }
      //file path
      $fp = UPLOAD_DIR.$nextId."/".$delkey;
      unlink($fp);  
  }
  

 

Is this what you mean

$delkey = $_POST['key'];
  if(in_array($delkey, $_SESSION['other-image']['img'])){
      $imgkey = array_search($delkey, $_SESSION['other-image']['img']);
      if($imgkey) {
          foreach (['img', 'path', 'type', 'thumb'] as $sub) {
              unset($_SESSION['other-image'][$sub][$imgkey]);
          }
      }
      //file path
      $fp = UPLOAD_DIR.$nextId."/".$delkey;
      unlink($fp);  
  }
  

 

Yes sir. Its exactly what I needed.

 

Now I want to insert these data into mysql. Sir, can you tell me how to do it?

 

I tried it something like this, but it doesn't work.

      //Insert other post image:
      if(!empty($_SESSION['other-image'])) {
        $query = "INSERT INTO post_image (
                                        image_type
                                      , image
                                      , thumb
                                      , image_path
                                      , sort_order
                                      , added_date
                                      ) VALUES (?,?,?,?,?,NOW())";
        $stmt = $mysqli->prepare($query);
        $stmt->bind_param('isssi', $type
                                 , $image
                                 , $thumb
                                 , $path
                                 , $sort_order
                               );        
        $order=2;
        foreach ($_SESSION['other-image'] as $value) {
          foreach ($value as $v) {
            $type = $_SESSION['other-image']['type'][$v])
            $image = $_SESSION['other-image']['img'][$v])
            $thumb = $_SESSION['other-image']['thumb'][$v])
            $path = $_SESSION['other-image']['path'][$v])
            $sort_order = $order;
            $stmt->execute();  
          }
          
          ++$order;  
        }
      }
  • Solution

Rearrange the array so you gather the values for each record together

$other_image = Array
  (
    'img' => Array
        (
            '0' => '1526973657.jpg',
            '1' => '1526973661.jpg',
            '2' => '1526973665.jpg'
        ),

    'path' => Array
        (
            '0' => '../post-upload/1/',
            '1' => '../post-upload/1/',
            '2' => '../post-upload/1/'
        ),

    'type' => Array
        (
            '0' => 1,
            '1' => 1,
            '2' => 1
        ),

    'thumb' => Array
        (
            '0' => 'thumb_1526973661.jpg',
            '1' => 'thumb_1526973665.jpg',
            '2' => 'thumb_1526973668.jpg'
        )

  );

$record_vals = [];         // values for each record to be inserted

foreach ($other_image as $name => $values) {
    foreach ($values as $k => $v) {
        $record_vals[$k][$name] = $v;
    }
}

Now you have an array that you can loop through to insert the records

$record_vals = Array
(
    [0] => Array
        (
            [img] => 1526973657.jpg
            [path] => ../post-upload/1/
            [type] => 1
            [thumb] => thumb_1526973661.jpg
        )

    [1] => Array
        (
            [img] => 1526973661.jpg
            [path] => ../post-upload/1/
            [type] => 1
            [thumb] => thumb_1526973665.jpg
        )

    [2] => Array
        (
            [img] => 1526973665.jpg
            [path] => ../post-upload/1/
            [type] => 1
            [thumb] => thumb_1526973668.jpg
        )

)

Sir, I tried it in this way:

      //Insert other post image:
      if(!empty($_SESSION['other-image'])) {
        $record_vals = [];

        foreach ($other_image as $name => $values) {
          foreach ($values as $k => $v) {
            $record_vals[$k][$name] = $v;
          }
        }

        $query = "INSERT INTO post_image (
                                        image_type
                                      , image
                                      , thumb
                                      , image_path
                                      , sort_order
                                      , added_date
                                      ) VALUES (?,?,?,?,?,NOW())";
        $stmt = $mysqli->prepare($query);
        $stmt->bind_param('isssi', $type
                                 , $image
                                 , $thumb
                                 , $path
                                 , $sort_order
                               );        
        $order=2;
        foreach ($record_vals as $k = > $v) {
          foreach ($v as $column => $value) {
            $image = $record_vals[$k]['img'][$value];
            $path  = $record_vals[$k]['path'][$value];
            $type  = $record_vals[$k]['type'][$value];
            $thumb = $record_vals[$k]['thumb'][$value];
            $sort_order = $order;
            $stmt->execute();  
          }
          ++$order;  
        }
      }

Can you tell me what is the mistake I have done?

For testing, I created an array $other_image. Yours is in a session variable.

 

Don't just copy and paste without reading the code.

 

As for processing the record_vals array - examine the structure. You are greatly over complicating it,

$sort_order = 2;
foreach ($record_vals as $rec) {
    $image = $rec['img'];
    $path = $rec['path'];
    $type = $rec['type'];
    $thumb = $rec['thumb'];
    
    $stmt->execute();
}

PS

I gave you that approach to avoid giving you the complete solution yet keep the next step as simple as possible for you.

 

An alternative, and shorter, method (note: still using my array and not your session var)

$sort_order = 2;
foreach ($other_image['img'] as $rec => $image) {
    $path = $other_image['path'][$rec];
    $type = $other_image['type'][$rec];
    $thumb = $other_image['thumb'][$rec];
    
    $stmt->execute();
}

  • Thanks 1
This thread is more than a year old. Please don't revive it unless you have something important to add.

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

  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.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.