<?php
$in = print_r_reverse("
Array
(
[0] => Array
(
[Import] => Array
(
[product_id] => 1
[id] => 1
[category_id] => 1
[amount] => 50
[cost] => 8320
[paid] => 0
[comment] => transportation and others cost: 100
[created] => 2015-06-22 12:09:20
)
[0] => Array
(
[total_sell] => 6
)
)
[1] => Array
(
[Import] => Array
(
[product_id] => 2
[id] => 2
[category_id] => 2
[amount] => 15
[cost] => 3000
[paid] => 0
[comment] =>
[created] => 2015-06-22 12:10:36
)
[0] => Array
(
[total_sell] => 1
)
)
[2] => Array
(
[Import] => Array
(
[product_id] => 1
[id] => 3
[category_id] => 1
[amount] => 15
[cost] => 2000
[paid] => 0
[comment] =>
[created] => 2015-06-22 12:10:58
)
[0] => Array
(
[total_sell] => 6
)
)
[3] => Array
(
[Import] => Array
(
[product_id] => 1
[id] => 4
[category_id] => 1
[amount] => 50
[cost] => 8000
[paid] => 0
[comment] =>
[created] => 2015-06-23 01:10:10
)
[0] => Array
(
[total_sell] => 6
)
)
)");
$desired = print_r_reverse("
Array
(
[0] => Array
(
[Import] => Array
(
[product_id] => 1
[id] => 1
[category_id] => 1
[amount] => 50
[cost] => 8320
[paid] => 0
[comment] => transportation and others cost: 100
[created] => 2015-06-22 12:09:20
)
[0] => Array
(
[total_sell] => 6
)
)
[1] => Array
(
[Import] => Array
(
[product_id] => 2
[id] => 2
[category_id] => 2
[amount] => 15
[cost] => 3000
[paid] => 0
[comment] =>
[created] => 2015-06-22 12:10:36
)
[0] => Array
(
[total_sell] => 1
)
)
)");
////////////////////
$out = [];
$hashTable = [];
foreach($in as $item) {
$pid = $item['Import']['product_id'];
if(!isset($hashTable[$pid])) { $out[] = $item;
$hashTable[$pid] = true;
}
}
// Prove they are the same!
echo "They are the same!!";
}
//////////////////
function print_r_reverse($in) {
if (trim($lines[0]) != 'Array') { // bottomed out to something that isn't an array
return $in;
} else {
// this is an array, lets parse it
if (preg_match("/(\s{5,})\(/", $lines[1], $match)) { // this is a tested array/recursive call to this function
// take a set of spaces off the beginning
$spaces = $match[1];
$spaces_length = strlen($spaces); $lines_total = count($lines); for ($i = 0; $i < $lines_total; $i++) {
if (substr($lines[$i], 0, $spaces_length) == $spaces) { $lines[$i] = substr($lines[$i], $spaces_length); }
}
}
// make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE
| PREG_SET_ORDER
); $previous_key = '';
// store the following in $pos:
// array with key = key of the parsed array's item
// value = array(start position in $in, $end position in $in)
foreach ($matches as $match) {
$key = $match[1][0];
$start = $match[0][1] + strlen($match[0][0]); $pos[$key] = array($start, $in_length); if ($previous_key != '') $pos[$previous_key][1] = $match[0][1] - 1;
$previous_key = $key;
}
foreach ($pos as $key => $where) {
// recursively see if the parsed out value is an array too
$ret[$key] = print_r_reverse
(substr($in, $where[0], $where[1] - $where[0])); }
return $ret;
}
}
PD9waHAKJGluID0gcHJpbnRfcl9yZXZlcnNlKCIKQXJyYXkKKAogICAgWzBdID0+IEFycmF5CiAgICAgICAgKAogICAgICAgICAgICBbSW1wb3J0XSA9PiBBcnJheQogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIFtwcm9kdWN0X2lkXSA9PiAxCiAgICAgICAgICAgICAgICAgICAgW2lkXSA9PiAxCiAgICAgICAgICAgICAgICAgICAgW2NhdGVnb3J5X2lkXSA9PiAxCiAgICAgICAgICAgICAgICAgICAgW2Ftb3VudF0gPT4gNTAKICAgICAgICAgICAgICAgICAgICBbY29zdF0gPT4gODMyMAogICAgICAgICAgICAgICAgICAgIFtwYWlkXSA9PiAwCiAgICAgICAgICAgICAgICAgICAgW2NvbW1lbnRdID0+IHRyYW5zcG9ydGF0aW9uIGFuZCBvdGhlcnMgY29zdDogMTAwICAKICAgICAgICAgICAgICAgICAgICBbY3JlYXRlZF0gPT4gMjAxNS0wNi0yMiAxMjowOToyMAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgWzBdID0+IEFycmF5CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgW3RvdGFsX3NlbGxdID0+IDYKICAgICAgICAgICAgICAgICkKCiAgICAgICAgKQoKICAgIFsxXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgW0ltcG9ydF0gPT4gQXJyYXkKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBbcHJvZHVjdF9pZF0gPT4gMgogICAgICAgICAgICAgICAgICAgIFtpZF0gPT4gMgogICAgICAgICAgICAgICAgICAgIFtjYXRlZ29yeV9pZF0gPT4gMgogICAgICAgICAgICAgICAgICAgIFthbW91bnRdID0+IDE1CiAgICAgICAgICAgICAgICAgICAgW2Nvc3RdID0+IDMwMDAKICAgICAgICAgICAgICAgICAgICBbcGFpZF0gPT4gMAogICAgICAgICAgICAgICAgICAgIFtjb21tZW50XSA9PiAKICAgICAgICAgICAgICAgICAgICBbY3JlYXRlZF0gPT4gMjAxNS0wNi0yMiAxMjoxMDozNgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgWzBdID0+IEFycmF5CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgW3RvdGFsX3NlbGxdID0+IDEKICAgICAgICAgICAgICAgICkKCiAgICAgICAgKQoKICAgIFsyXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgW0ltcG9ydF0gPT4gQXJyYXkKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBbcHJvZHVjdF9pZF0gPT4gMQogICAgICAgICAgICAgICAgICAgIFtpZF0gPT4gMwogICAgICAgICAgICAgICAgICAgIFtjYXRlZ29yeV9pZF0gPT4gMQogICAgICAgICAgICAgICAgICAgIFthbW91bnRdID0+IDE1CiAgICAgICAgICAgICAgICAgICAgW2Nvc3RdID0+IDIwMDAKICAgICAgICAgICAgICAgICAgICBbcGFpZF0gPT4gMAogICAgICAgICAgICAgICAgICAgIFtjb21tZW50XSA9PiAKICAgICAgICAgICAgICAgICAgICBbY3JlYXRlZF0gPT4gMjAxNS0wNi0yMiAxMjoxMDo1OAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgWzBdID0+IEFycmF5CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgW3RvdGFsX3NlbGxdID0+IDYKICAgICAgICAgICAgICAgICkKCiAgICAgICAgKQoKICAgIFszXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgW0ltcG9ydF0gPT4gQXJyYXkKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBbcHJvZHVjdF9pZF0gPT4gMQogICAgICAgICAgICAgICAgICAgIFtpZF0gPT4gNAogICAgICAgICAgICAgICAgICAgIFtjYXRlZ29yeV9pZF0gPT4gMQogICAgICAgICAgICAgICAgICAgIFthbW91bnRdID0+IDUwCiAgICAgICAgICAgICAgICAgICAgW2Nvc3RdID0+IDgwMDAKICAgICAgICAgICAgICAgICAgICBbcGFpZF0gPT4gMAogICAgICAgICAgICAgICAgICAgIFtjb21tZW50XSA9PiAKICAgICAgICAgICAgICAgICAgICBbY3JlYXRlZF0gPT4gMjAxNS0wNi0yMyAwMToxMDoxMAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgWzBdID0+IEFycmF5CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgW3RvdGFsX3NlbGxdID0+IDYKICAgICAgICAgICAgICAgICkKCiAgICAgICAgKQoKKSIpOwoKCiRkZXNpcmVkID0gcHJpbnRfcl9yZXZlcnNlKCIKQXJyYXkKKAogICAgWzBdID0+IEFycmF5CiAgICAgICAgKAogICAgICAgICAgICBbSW1wb3J0XSA9PiBBcnJheQogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIFtwcm9kdWN0X2lkXSA9PiAxCiAgICAgICAgICAgICAgICAgICAgW2lkXSA9PiAxCiAgICAgICAgICAgICAgICAgICAgW2NhdGVnb3J5X2lkXSA9PiAxCiAgICAgICAgICAgICAgICAgICAgW2Ftb3VudF0gPT4gNTAKICAgICAgICAgICAgICAgICAgICBbY29zdF0gPT4gODMyMAogICAgICAgICAgICAgICAgICAgIFtwYWlkXSA9PiAwCiAgICAgICAgICAgICAgICAgICAgW2NvbW1lbnRdID0+IHRyYW5zcG9ydGF0aW9uIGFuZCBvdGhlcnMgY29zdDogMTAwICAKICAgICAgICAgICAgICAgICAgICBbY3JlYXRlZF0gPT4gMjAxNS0wNi0yMiAxMjowOToyMAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgWzBdID0+IEFycmF5CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgW3RvdGFsX3NlbGxdID0+IDYKICAgICAgICAgICAgICAgICkKCiAgICAgICAgKQoKICAgIFsxXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgW0ltcG9ydF0gPT4gQXJyYXkKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBbcHJvZHVjdF9pZF0gPT4gMgogICAgICAgICAgICAgICAgICAgIFtpZF0gPT4gMgogICAgICAgICAgICAgICAgICAgIFtjYXRlZ29yeV9pZF0gPT4gMgogICAgICAgICAgICAgICAgICAgIFthbW91bnRdID0+IDE1CiAgICAgICAgICAgICAgICAgICAgW2Nvc3RdID0+IDMwMDAKICAgICAgICAgICAgICAgICAgICBbcGFpZF0gPT4gMAogICAgICAgICAgICAgICAgICAgIFtjb21tZW50XSA9PiAKICAgICAgICAgICAgICAgICAgICBbY3JlYXRlZF0gPT4gMjAxNS0wNi0yMiAxMjoxMDozNgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgWzBdID0+IEFycmF5CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgW3RvdGFsX3NlbGxdID0+IDEKICAgICAgICAgICAgICAgICkKCiAgICAgICAgKQoKKSIpOwoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vCgokb3V0ID0gW107IAokaGFzaFRhYmxlID0gW107CmZvcmVhY2goJGluIGFzICRpdGVtKSB7CiAgJHBpZCA9ICRpdGVtWydJbXBvcnQnXVsncHJvZHVjdF9pZCddOwogIGlmKCFpc3NldCgkaGFzaFRhYmxlWyRwaWRdKSkgewogIAkkb3V0W10gPSAkaXRlbTsgCiAgCSRoYXNoVGFibGVbJHBpZF0gPSB0cnVlOwogIH0KfQoKcHJpbnRfcigkb3V0KTsKCi8vIFByb3ZlIHRoZXkgYXJlIHRoZSBzYW1lIQppZigganNvbl9lbmNvZGUoJG91dCkgPT09IGpzb25fZW5jb2RlKCRkZXNpcmVkKSApIHsKCWVjaG8gIlRoZXkgYXJlIHRoZSBzYW1lISEiOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8KCgpmdW5jdGlvbiBwcmludF9yX3JldmVyc2UoJGluKSB7CiAgICAkbGluZXMgPSBleHBsb2RlKCJcbiIsIHRyaW0oJGluKSk7CiAgICBpZiAodHJpbSgkbGluZXNbMF0pICE9ICdBcnJheScpIHsKICAgICAgICAvLyBib3R0b21lZCBvdXQgdG8gc29tZXRoaW5nIHRoYXQgaXNuJ3QgYW4gYXJyYXkKICAgICAgICByZXR1cm4gJGluOwogICAgfSBlbHNlIHsKICAgICAgICAvLyB0aGlzIGlzIGFuIGFycmF5LCBsZXRzIHBhcnNlIGl0CiAgICAgICAgaWYgKHByZWdfbWF0Y2goIi8oXHN7NSx9KVwoLyIsICRsaW5lc1sxXSwgJG1hdGNoKSkgewogICAgICAgICAgICAvLyB0aGlzIGlzIGEgdGVzdGVkIGFycmF5L3JlY3Vyc2l2ZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgLy8gdGFrZSBhIHNldCBvZiBzcGFjZXMgb2ZmIHRoZSBiZWdpbm5pbmcKICAgICAgICAgICAgJHNwYWNlcyA9ICRtYXRjaFsxXTsKICAgICAgICAgICAgJHNwYWNlc19sZW5ndGggPSBzdHJsZW4oJHNwYWNlcyk7CiAgICAgICAgICAgICRsaW5lc190b3RhbCA9IGNvdW50KCRsaW5lcyk7CiAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRsaW5lc190b3RhbDsgJGkrKykgewogICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkbGluZXNbJGldLCAwLCAkc3BhY2VzX2xlbmd0aCkgPT0gJHNwYWNlcykgewogICAgICAgICAgICAgICAgICAgICRsaW5lc1skaV0gPSBzdWJzdHIoJGxpbmVzWyRpXSwgJHNwYWNlc19sZW5ndGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFycmF5X3NoaWZ0KCRsaW5lcyk7IC8vIEFycmF5CiAgICAgICAgYXJyYXlfc2hpZnQoJGxpbmVzKTsgLy8gKAogICAgICAgIGFycmF5X3BvcCgkbGluZXMpOyAvLyApCiAgICAgICAgJGluID0gaW1wbG9kZSgiXG4iLCAkbGluZXMpOwogICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBvbmx5IG1hdGNoIHN0dWZmIHdpdGggNCBwcmVjZWRpbmcgc3BhY2VzIChzdHVmZiBmb3IgdGhpcyBhcnJheSBhbmQgbm90IGEgbmVzdGVkIG9uZSkKICAgICAgICBwcmVnX21hdGNoX2FsbCgiL15cc3s0fVxbKC4rPylcXSBcPVw+IC9tIiwgJGluLCAkbWF0Y2hlcywgUFJFR19PRkZTRVRfQ0FQVFVSRSB8IFBSRUdfU0VUX09SREVSKTsKICAgICAgICAkcG9zID0gYXJyYXkoKTsKICAgICAgICAkcHJldmlvdXNfa2V5ID0gJyc7CiAgICAgICAgJGluX2xlbmd0aCA9IHN0cmxlbigkaW4pOwogICAgICAgIC8vIHN0b3JlIHRoZSBmb2xsb3dpbmcgaW4gJHBvczoKICAgICAgICAvLyBhcnJheSB3aXRoIGtleSA9IGtleSBvZiB0aGUgcGFyc2VkIGFycmF5J3MgaXRlbQogICAgICAgIC8vIHZhbHVlID0gYXJyYXkoc3RhcnQgcG9zaXRpb24gaW4gJGluLCAkZW5kIHBvc2l0aW9uIGluICRpbikKICAgICAgICBmb3JlYWNoICgkbWF0Y2hlcyBhcyAkbWF0Y2gpIHsKICAgICAgICAgICAgJGtleSA9ICRtYXRjaFsxXVswXTsKICAgICAgICAgICAgJHN0YXJ0ID0gJG1hdGNoWzBdWzFdICsgc3RybGVuKCRtYXRjaFswXVswXSk7CiAgICAgICAgICAgICRwb3NbJGtleV0gPSBhcnJheSgkc3RhcnQsICRpbl9sZW5ndGgpOwogICAgICAgICAgICBpZiAoJHByZXZpb3VzX2tleSAhPSAnJykgJHBvc1skcHJldmlvdXNfa2V5XVsxXSA9ICRtYXRjaFswXVsxXSAtIDE7CiAgICAgICAgICAgICRwcmV2aW91c19rZXkgPSAka2V5OwogICAgICAgIH0KICAgICAgICAkcmV0ID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkcG9zIGFzICRrZXkgPT4gJHdoZXJlKSB7CiAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZWx5IHNlZSBpZiB0aGUgcGFyc2VkIG91dCB2YWx1ZSBpcyBhbiBhcnJheSB0b28KICAgICAgICAgICAgJHJldFska2V5XSA9IHByaW50X3JfcmV2ZXJzZShzdWJzdHIoJGluLCAkd2hlcmVbMF0sICR3aGVyZVsxXSAtICR3aGVyZVswXSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJldDsKICAgIH0KfSA=