migmag-1.0.x-dev/src/Utility/MigMagArrayUtility.php
src/Utility/MigMagArrayUtility.php
<?php
declare(strict_types=1);
namespace Drupal\migmag\Utility;
/**
* Utility for array manipulation.
*/
class MigMagArrayUtility {
/**
* Inserts a new key into an array in front of the specified key.
*
* E.g. With this method we can add a new process pipeline to a migration
* plugin definition in front of the specified destination property.
*
* @param array $array_to_modify
* The array to modify.
* @param string $reference_key
* The reference key.
* @param string $new_key
* The new key.
* @param mixed $new_value
* The value for the new array key.
* @param bool $overwrite
* Whether a preexisting value should be updated or not. Defaults to FALSE.
*/
public static function insertInFrontOfKey(array &$array_to_modify, string $reference_key, string $new_key, $new_value, bool $overwrite = FALSE): void {
$index_of_reference = array_search($reference_key, array_keys($array_to_modify));
if ($index_of_reference === FALSE) {
throw new \LogicException(
sprintf(
"The reference key '%s' cannot be found in the array.",
$reference_key
)
);
}
// Check if the specified new destination property is already available.
$index_of_new_key = array_search($new_key, array_keys($array_to_modify));
// The specified new destination property is already available.
if ($index_of_new_key !== FALSE) {
if ($overwrite) {
$array_to_modify[$new_key] = $new_value;
}
// The new process is already in the right position.
if ($index_of_reference > $index_of_new_key) {
return;
}
$new_value = $array_to_modify[$new_key];
unset($array_to_modify[$new_key]);
}
$array_to_modify = array_merge(
array_slice($array_to_modify, 0, $index_of_reference, TRUE),
[$new_key => $new_value],
array_slice($array_to_modify, $index_of_reference, NULL, TRUE)
);
}
/**
* Inserts a new key into an array after the specified key.
*
* With this method we can add a new process pipeline to a migration plugin
* definition after the specified destination property.
*
* @param array $array_to_modify
* The array to modify.
* @param string $reference_key
* The reference key.
* @param string $new_key
* The new key.
* @param mixed $new_value
* The value for the new array key.
* @param bool $overwrite
* Whether a preexisting value should be updated or not. Defaults to FALSE.
*/
public static function insertAfterKey(array &$array_to_modify, string $reference_key, string $new_key, $new_value, bool $overwrite = FALSE): void {
$index_of_reference = array_search($reference_key, array_keys($array_to_modify));
if ($index_of_reference === FALSE) {
throw new \LogicException(
sprintf(
"The reference key '%s' cannot be found in the array.",
$reference_key
)
);
}
// Check if the specified new destination property is already available.
$index_of_new_key = array_search($new_key, array_keys($array_to_modify));
// The specified new destination property is already available.
if ($index_of_new_key !== FALSE) {
if ($overwrite) {
$array_to_modify[$new_key] = $new_value;
}
// The new process is already in the right position.
if ($index_of_reference < $index_of_new_key) {
return;
}
$new_value = $array_to_modify[$new_key];
unset($array_to_modify[$new_key]);
}
$array_to_modify = array_merge(
array_slice($array_to_modify, 0, $index_of_reference + 1, TRUE),
[$new_key => $new_value],
array_slice($array_to_modify, $index_of_reference + 1, NULL, TRUE)
);
}
/**
* Moves a key-value pair of an array in front of the specified reference key.
*
* @param array $array_to_modify
* The array to modify.
* @param string $reference_key
* The reference key.
* @param string $moved_key
* The key to be moved.
*/
public static function moveInFrontOfKey(array &$array_to_modify, string $reference_key, string $moved_key): void {
$index_of_reference = array_search($reference_key, array_keys($array_to_modify));
$index_of_moved = array_search($moved_key, array_keys($array_to_modify));
$exception_message = [];
if ($index_of_reference === FALSE) {
$exception_message[] = sprintf(
"The given reference key '%s' cannot be found in the array",
$reference_key
);
}
if ($index_of_moved === FALSE) {
$exception_message[] = sprintf(
"The given key '%s' to move cannot be found in the array",
$moved_key
);
}
if ($index_of_reference !== FALSE && $index_of_reference === $index_of_moved) {
$exception_message[] = 'The reference and the moved key cannot be the same';
}
if (!empty($exception_message)) {
throw new \LogicException(implode("\n", $exception_message));
}
if ($index_of_reference > $index_of_moved) {
return;
}
$moved_value = $array_to_modify[$moved_key];
unset($array_to_modify[$moved_key]);
$index_of_reference = array_search($reference_key, array_keys($array_to_modify));
$array_to_modify = array_merge(
array_slice($array_to_modify, 0, $index_of_reference, TRUE),
[$moved_key => $moved_value],
array_slice($array_to_modify, $index_of_reference, NULL, TRUE)
);
}
/**
* Moves a key-value pair of an array after the specified reference key.
*
* @param array $array_to_modify
* The array to modify.
* @param string $reference_key
* The reference key.
* @param string $moved_key
* The key to be moved.
*/
public static function moveAfterKey(array &$array_to_modify, string $reference_key, string $moved_key): void {
$index_of_reference = array_search($reference_key, array_keys($array_to_modify));
$index_of_moved = array_search($moved_key, array_keys($array_to_modify));
$exception_message = [];
if ($index_of_reference === FALSE) {
$exception_message[] = sprintf(
"The given reference key '%s' cannot be found in the array",
$reference_key
);
}
if ($index_of_moved === FALSE) {
$exception_message[] = sprintf(
"The given key '%s' to move cannot be found in the array",
$moved_key
);
}
if ($index_of_reference !== FALSE && $index_of_reference === $index_of_moved) {
$exception_message[] = 'The reference and the moved key cannot be the same';
}
if (!empty($exception_message)) {
throw new \LogicException(implode("\n", $exception_message));
}
if ($index_of_reference < $index_of_moved) {
return;
}
$moved_value = $array_to_modify[$moved_key];
unset($array_to_modify[$moved_key]);
$index_of_reference = array_search($reference_key, array_keys($array_to_modify));
$array_to_modify = array_merge(
array_slice($array_to_modify, 0, $index_of_reference + 1, TRUE),
[$moved_key => $moved_value],
array_slice($array_to_modify, $index_of_reference + 1, NULL, TRUE)
);
}
/**
* Adds the specified suffix to the specified values of an array.
*
* @param string[] $haystack
* List of strings to search in between.
* @param string[] $needles
* The list of strings which should get the specified suffix.
* @param string $suffix_to_add
* The suffix to add.
*/
public static function addSuffixToArrayValues(array &$haystack, array $needles, string $suffix_to_add): void {
foreach ($needles as $original_dependency_id) {
$dependency_key = array_search($original_dependency_id, $haystack, TRUE);
if ($dependency_key !== FALSE) {
$haystack[$dependency_key] .= $suffix_to_add;
}
}
}
}
