Fixed E_NOTICE in listing worker queue and new utilities class added (#5521)

* Fixes for E_NOTICE in workqueue:
- introduced class `Friendica\Util\Arrays` which will hold static methods for
  handling arrays that cannot be done with PHP's functions, like implode() on
  multi-dimensional arrays
- rewrote old-school for() loop to foreach()

* Added intial unit test with some tests on empty delimiters and/or sinle and
multi-dim array.

* Added test for for 3-dimensional arrays, thanks to  nupplaphil's feedback.
This commit is contained in:
Roland Häder 2018-07-31 03:24:26 +02:00 committed by Hypolite Petovan
parent 3da1b9f319
commit bf87ad4fcf
3 changed files with 166 additions and 2 deletions

View file

@ -21,6 +21,7 @@ use Friendica\Model\Item;
use Friendica\Model\User; use Friendica\Model\User;
use Friendica\Module\Login; use Friendica\Module\Login;
use Friendica\Module\Tos; use Friendica\Module\Tos;
use Friendica\Util\Arrays;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Temporal; use Friendica\Util\Temporal;
@ -783,9 +784,9 @@ function admin_page_workerqueue(App $a)
$statement = DBA::select('workerqueue', ['id', 'parameter', 'created', 'priority'], ['done' => 0], ['order'=> ['priority']]); $statement = DBA::select('workerqueue', ['id', 'parameter', 'created', 'priority'], ['done' => 0], ['order'=> ['priority']]);
$r = DBA::toArray($statement); $r = DBA::toArray($statement);
for($i = 0; $i < count($r); $i++) { foreach ($r as $key => $rr) {
// fix GH-5469. ref: src/Core/Worker.php:217 // fix GH-5469. ref: src/Core/Worker.php:217
$r[$i]['parameter'] = implode(json_decode($r[$i]['parameter'], true), ': '); $r[$key]['parameter'] = Arrays::recursiveImplode(json_decode($rr['parameter'], true), ': ');
} }
$t = get_markup_template('admin/workerqueue.tpl'); $t = get_markup_template('admin/workerqueue.tpl');

49
src/Util/Arrays.php Normal file
View file

@ -0,0 +1,49 @@
<?php
/**
* @file src/Util/Arrays.php
* @author Roland Haeder<https://f.haeder.net/profile/roland>
*/
namespace Friendica\Util;
/**
* @brief Array utility class
*/
class Arrays
{
/**
* @brief Private constructor
*/
private function __construct () {
// Utitlities don't have instances
}
/**
* @briefs Implodes recursively a multi-dimensional array where a normal implode() will fail.
*
* @param array $array Array to implode
* @param string $glue Glue for imploded elements
* @return string String with elements from array
*/
public static function recursiveImplode (array $array, $glue) {
// Init returned string
$string = '';
// Loop through all records
foreach ($array as $element) {
// Is an array found?
if (is_array($element)) {
// Invoke cursively
$string .= '{' . self::recursiveImplode($element, $glue) . '}' . $glue;
} else {
// Append normally
$string .= $element . $glue;
}
}
// Remove last glue
$string = trim($string, $glue);
// Return it
return $string;
}
}

View file

@ -0,0 +1,114 @@
<?php
/**
* @file tests/src/Util/Arrays.php
* @author Roland Haeder<https://f.haeder.net/profile/roland>
*/
namespace Friendica\Test\Util;
use Friendica\Util\Arrays;
use PHPUnit\Framework\TestCase;
/**
* @brief Array utility testing class
*/
class ArraysTest extends TestCase
{
/**
* @brief Tests if an empty array and an empty delimiter returns an empty string.
*/
public function testEmptyArrayEmptyDelimiter()
{
$str = Arrays::recursiveImplode([], '');
$this->assertEmpty($str);
}
/**
* @brief Tests if an empty array and a non-empty delimiter returns an empty string.
*/
public function testEmptyArrayNonEmptyDelimiter()
{
$str = Arrays::recursiveImplode([], ',');
$this->assertEmpty($str);
}
/**
* @brief Tests if a non-empty array and an empty delimiter returns the value (1).
*/
public function testNonEmptyArrayEmptyDelimiter()
{
$str = Arrays::recursiveImplode([1], '');
$this->assertSame($str, '1');
}
/**
* @brief Tests if a non-empty array and an empty delimiter returns the value (12).
*/
public function testNonEmptyArray2EmptyDelimiter()
{
$str = Arrays::recursiveImplode([1, 2], '');
$this->assertSame($str, '12');
}
/**
* @brief Tests if a non-empty array and a non-empty delimiter returns the value (1).
*/
public function testNonEmptyArrayNonEmptyDelimiter()
{
$str = Arrays::recursiveImplode([1], ',');
$this->assertSame($str, '1');
}
/**
* @brief Tests if a non-empty array and a non-empty delimiter returns the value (1,2).
*/
public function testNonEmptyArray2NonEmptyDelimiter()
{
$str = Arrays::recursiveImplode([1, 2], ',');
$this->assertSame($str, '1,2');
}
/**
* @brief Tests if a 2-dim array and an empty delimiter returns the expected string.
*/
public function testEmptyMultiArray2EmptyDelimiter()
{
$str = Arrays::recursiveImplode([[1], []], '');
$this->assertSame($str, '{1}{}');
}
/**
* @brief Tests if a 2-dim array and an empty delimiter returns the expected string.
*/
public function testEmptyMulti2Array2EmptyDelimiter()
{
$str = Arrays::recursiveImplode([[1], [2]], '');
$this->assertSame($str, '{1}{2}');
}
/**
* @brief Tests if a 2-dim array and a non-empty delimiter returns the expected string.
*/
public function testEmptyMultiArray2NonEmptyDelimiter()
{
$str = Arrays::recursiveImplode([[1], []], ',');
$this->assertSame($str, '{1},{}');
}
/**
* @brief Tests if a 2-dim array and a non-empty delimiter returns the expected string.
*/
public function testEmptyMulti2Array2NonEmptyDelimiter()
{
$str = Arrays::recursiveImplode([[1], [2]], ',');
$this->assertSame($str, '{1},{2}');
}
/**
* @brief Tests if a 3-dim array and a non-empty delimiter returns the expected string.
*/
public function testEmptyMulti3Array2NonEmptyDelimiter()
{
$str = Arrays::recursiveImplode([[1], [2, [3]]], ',');
$this->assertSame($str, '{1},{2,{3}}');
}
}