windwalker/utilities

Windwalker Utilities package

Installs: 6 865

Dependents: 8

Suggesters: 1

Stars: 0

Watchers: 3

Forks: 0

Open Issues: 0

Type:windwalker-package


README

Installation via Composer

Add this to the require block in your composer.json.

{
    "require": {
        "windwalker/utilities": "~3.0"
    }
}

New Arr Class

We are trying to use \Windwalker\Utilities\Arr replace old ArrayHelper.

Simple Usage

Get and set:

$bar = Arr::get($arrayOrObject, 'foo.bar', 'default');

Arr::set($arrayOrObject, 'foo.baz', 'value');

Arr::has($arrayOrObject, 'foo.baz');
Arr::remove($arrayOrObject, 'foo.baz');

Method list of Arr

Arr::toArray($data, $recursive = false)
Arr::toObject(array $array, $class = 'stdClass')
Arr::has($array, $key, $delimiter = '.')
Arr::def($array, $key, $value, $delimiter = '.')
Arr::get($data, $key, $default = null, $delimiter = '.')
Arr::set($data, $key, $value, $delimiter = '.', $storeType = 'array')
Arr::remove($data, $key, $delimiter = '.')
Arr::collapse($data)
Arr::flatten($array, $delimiter = '.', $depth = 0, $prefix = null)
Arr::only($data, array $fields)
Arr::find(array $data, callable $callback = null, $keepKey = false, $offset = null, $limit = null)
Arr::findFirst(array $data, callable $callback = null)
Arr::reject(array $data, callable $callback, $keepKey = false)
Arr::takeout(&$data, $key, $default = null, $delimiter = '.')
Arr::sort(array $data, $condition, $descending = false, $options = SORT_REGULAR)
Arr::invert(array $array)
Arr::pivot(array $array)
Arr::isAssociative(array $array)
Arr::accessible($array)
Arr::group(array $array, $key = null, $forceArray = false)
Arr::unique(array $array)
Arr::mergeRecursive($array1)
Arr::dump($data, $depth = 5)
Arr::show($arg)
Arr::map(array $array, callable $callback, $recursive = false)

Using ArrayHelper

toObject

use Windwalker\Utilities\ArrayHelper;

class Book {
    public $name;
    public $author;
    public $genre;
    public $rating;
}
class Author {
    public $name;
    public $born;
}
$input = array(
    "name" => "The Hitchhiker's Guide to the Galaxy",
    "author" => array(
        "name" => "Douglas Adams",
        "born" => 1952,
        "died" => 2001),
    "genre" => "comic science fiction",
    "rating" => 10
);
$book = ArrayHelper::toObject($input, 'Book');
var_dump($book);

Result:

class Book#1 (4) {
  public $name =>
  string(36) "The Hitchhiker's Guide to the Galaxy"
  public $author =>
  class Book#2 (6) {
    public $name =>
    string(13) "Douglas Adams"
    public $author =>
    NULL
    public $genre =>
    NULL
    public $rating =>
    NULL
    public $born =>
    int(1952)
    public $died =>
    int(2001)
  }
  public $genre =>
  string(21) "comic science fiction"
  public $rating =>
  int(10)
}

getColumn

use Windwalker\Utilities\ArrayHelper;

$rows = array(
    array("name" => "John", "age" => 20),
    array("name" => "Alex", "age" => 35),
    array("name" => "Sarah", "age" => 27)
);
$names = ArrayHelper::getColumn($rows, 'name');
var_dump($names);

Result:

array(3) {
  [0] =>
  string(4) "John"
  [1] =>
  string(4) "Alex"
  [2] =>
  string(5) "Sarah"
}

getValue

use Windwalker\Utilities\ArrayHelper;

$city = array(
    "name" => "Oslo",
    "country" => "Norway"
);

// Prints 'Oslo'
echo ArrayHelper::getValue($city, 'name');

// Prints 'unknown mayor' (no 'mayor' key is found in the array)
echo ArrayHelper::getValue($city, 'mayor', 'unknown mayor');

invert

use Windwalker\Utilities\ArrayHelper;

$input = array(
    'New' => array('1000', '1500', '1750'),
    'Used' => array('3000', '4000', '5000', '6000')
);
$output = ArrayHelper::invert($input);
var_dump($output);

Result:

array(7) {
  [1000] =>
  string(3) "New"
  [1500] =>
  string(3) "New"
  [1750] =>
  string(3) "New"
  [3000] =>
  string(4) "Used"
  [4000] =>
  string(4) "Used"
  [5000] =>
  string(4) "Used"
  [6000] =>
  string(4) "Used"
}

isAssociative

use Windwalker\Utilities\ArrayHelper;

$user = array("id" => 46, "name" => "John");
echo ArrayHelper::isAssociative($user) ? 'true' : 'false'; // true

$letters = array("a", "b", "c");
echo ArrayHelper::isAssociative($letters) ? 'true' : 'false'; // false

group

use Windwalker\Utilities\ArrayHelper;

$movies = array(
    array('year' => 1972, 'title' => 'The Godfather'),
    array('year' => 2000, 'title' => 'Gladiator'),
    array('year' => 2000, 'title' => 'Memento'),
    array('year' => 1964, 'title' => 'Dr. Strangelove')
);
$pivoted = ArrayHelper::pivot($movies, 'year');
var_dump($pivoted);

Result:

array(3) {
  [1972] =>
  array(2) {
    'year' =>
    int(1972)
    'title' =>
    string(13) "The Godfather"
  }
  [2000] =>
  array(2) {
    [0] =>
    array(2) {
      'year' =>
      int(2000)
      'title' =>
      string(9) "Gladiator"
    }
    [1] =>
    array(2) {
      'year' =>
      int(2000)
      'title' =>
      string(7) "Memento"
    }
  }
  [1964] =>
  array(2) {
    'year' =>
    int(1964)
    'title' =>
    string(15) "Dr. Strangelove"
  }
}

sortObjects

use Windwalker\Utilities\ArrayHelper;

$members = array(
    (object) array('first_name' => 'Carl', 'last_name' => 'Hopkins'),
    (object) array('first_name' => 'Lisa', 'last_name' => 'Smith'),
    (object) array('first_name' => 'Julia', 'last_name' => 'Adams')
);
$sorted = ArrayHelper::sortObjects($members, 'last_name', 1);
var_dump($sorted);

Result:

array(3) {
  [0] =>
  class stdClass#3 (2) {
    public $first_name =>
    string(5) "Julia"
    public $last_name =>
    string(5) "Adams"
  }
  [1] =>
  class stdClass#1 (2) {
    public $first_name =>
    string(4) "Carl"
    public $last_name =>
    string(7) "Hopkins"
  }
  [2] =>
  class stdClass#2 (2) {
    public $first_name =>
    string(4) "Lisa"
    public $last_name =>
    string(5) "Smith"
  }
}

arrayUnique

use Windwalker\Utilities\ArrayHelper;

$names = array(
    array("first_name" => "John", "last_name" => "Adams"),
    array("first_name" => "John", "last_name" => "Adams"),
    array("first_name" => "John", "last_name" => "Smith"),
    array("first_name" => "Sam", "last_name" => "Smith")
);
$unique = ArrayHelper::arrayUnique($names);
var_dump($unique);

Result:

array(3) {
  [0] =>
  array(2) {
    'first_name' =>
    string(4) "John"
    'last_name' =>
    string(5) "Adams"
  }
  [2] =>
  array(2) {
    'first_name' =>
    string(4) "John"
    'last_name' =>
    string(5) "Smith"
  }
  [3] =>
  array(2) {
    'first_name' =>
    string(3) "Sam"
    'last_name' =>
    string(5) "Smith"
  }
}

flatten

use Windwalker\Utilities\ArrayHelper;

$array = array(
    'flower' => array(
        'sakura' => 'samurai',
        'olive' => 'peace'
    )
);

// Make nested data flatten and separate by dot (".")

$flatted1 = ArrayHelper::flatten($array);

echo $flatted1['flower.sakura']; // 'samuari'

// Custom separator

$flatted2 = ArrayHelper::flatten($array, '/');

echo $flatted2['flower/olive']; // 'peace'

merge

Recursive merge two array.

use Windwalker\Utilities\ArrayHelper;

$array2 = array(
    'flower' => array(
        'sakura' => 'samurai',
        'olive' => 'peace'
    )
);

$array2 = array(
    'flower' => array(
        'sakura' => 'overrided',
    )
);

$newArray = ArrayHelper:merge($array1, $array2, true);

Array
(
    [flower] => Array
    (
        [sakura] => overrided
        [olive] => peace
    )
)

match

Check an array matched our query condition.

$array = array(
    'id' => 1,
    'title' => 'Julius Caesar',
    'data' => (object) array('foo' => 'bar'),
);

// Check id=1
$bool = ArrayHelper::match($data, array('id' => 1));

// Check id=1 with strict compare (int)
$bool = ArrayHelper::match($data, array('id' => 1), true);

// Check id=1 AND title='Julius Caesar'
$bool = ArrayHelper::match($data, array('id' => 1, 'title' => 'Julius Caesar'));

// Check id IN (2,3,4)
$bool = ArrayHelper::match($data, array('id' => array(2, 3, 4)));

// Check id >= 2
$bool = ArrayHelper::match($data, array('id >=' => 2));

query

Find element matched array in array.

$data = array(
    array(
        'id' => 1,
        'title' => 'Julius Caesar',
        'data' => (object) array('foo' => 'bar'),
    ),
    array(
        'id' => 2,
        'title' => 'Macbeth',
        'data' => array(),
    ),
    array(
        'id' => 3,
        'title' => 'Othello',
        'data' => 123,
    ),
    array(
        'id' => 4,
        'title' => 'Hamlet',
        'data' => true,
    ),
);

// Query id=2
$newArray = ArrayHelper::query($data, array('id' => 2));

// Query id=2, use strict compare to check is int, not string
$newArray = ArrayHelper::query($data, array('id' => 2), true, [keepKey = false]);

// Query id=2 AND title='Macbeth'
$newArray = ArrayHelper::query($data, array('id' => 2, 'title' => 'Macbeth'));

// Query id IN (2,3,4)
$newArray = ArrayHelper::query($data, array('id' => array(2, 3, 4)));

// Query id >= 2
$newArray = ArrayHelper::query($data, array('id >=' => 2));

// Use callback, similar to array_filter()
$newArray = ArrayHelper::query($data, function ($key, $value, $strict)
{
    return $value['id'] == 3 || $value['title'] === 'Macbeth';
});