-3

I have a massive multi-dimensional associative array which I need to simplify. Here is an example of the data:

Array ( [0] => Array ( [sku] => 283085 ) [1] => Array ( [sku] => 283119 ) [2] => Array ( [sku] => 283127 ) [3] => Array ( [sku] => 283168 ) [4] => Array ( [sku] => 283184 ) [5] => Array ( [sku] => 283200 ) [6] => Array ( [sku] => 283234 ) [7] => Array ( [sku] => 283275 ) [8] => Array ( [sku] => 283309 ) [9] => Array ( [sku] => 283382 ) [10] => Array ( [sku] => 283531 ) [11] => Array ( [sku] => 283549 ) [12] => Array ( [sku] => 283556 ) [13] => Array ( [sku] => 283564 ) [14] => Array ( [sku] => 283598 ) [15] => Array ( [sku] => 507813 ) [16] => Array ( [sku] => 507814 ) [17] => Array ( [sku] => 507821 ) [18] => Array ( [sku] => 507823 ) [19] => Array ( [sku] => 507828 ) [20] => Array ( [sku] => 507829 ) [21] => Array ( [sku] => 507830 ) [22] => Array ( [sku] => 507832 ) [23] => Array ( [sku] => 507833 ) [24] => Array ( [sku] => 507836 ) [25] => Array ( [sku] => 508019 ) [26] => Array ( [sku] => 508053 ) [27] => Array ( [sku] => 3636 ) [28] => Array ( [sku] => 350138 ) [29] => Array ( [sku] => 350139 ) [30] => Array ( [sku] => 311144 ) [31] => Array ( [sku] => 311145 ) [32] => Array ( [sku] => 311147 ) [33] => Array ( [sku] => 311148 ) [34] => Array ( [sku] => 311150 ) [35] => Array ( [sku] => 311151 ) [36] => Array ( [sku] => 311153 ) [37] => Array ( [sku] => 311154 ) [38] => Array ( [sku] => 311156 ) [39] => Array ( [sku] => 311157 ) [40] => Array ( [sku] => 311159 ) [41] => Array ( [sku] => 311160 ) [42] => Array ( [sku] => 311161 ) [43] => Array ( [sku] => 311162 ) [44] => Array ( [sku] => 311164 ) [45] => Array ( [sku] => 311165 ) [46] => Array ( [sku] =......

I would like to return a minimal indexed array with any values of keys matching "sku" - doesn't matter where they lie in the array nesting.

End result should be something like this as I have a function which is anticipating an array of sku data:

Array(283085, 283119, 283119, ... )

What PHP array function would best above achieve the above? Currently I'm using array_push within a foreach loop to populate an indexed but I feel like I should be able to filter values somehow.

Example:

$result = $connection->fetchAll($sql);

$skus = $result;

$simpleSkuArray=array();

foreach ($skus as $sku)
{
    array_push($simpleSkuArray, $sku['sku']);
}

myFunction($simpleSkuArray);
sparecycle
  • 2,038
  • 5
  • 31
  • 58

3 Answers3

3

Simple use array_column() function returns the values from a single column in the input array

$new_arr = array_column($array,'sku');
print_r($new_arr);
JYoThI
  • 11,977
  • 1
  • 11
  • 26
2

Use array_map() or array_column()

// (PHP 4 >= 4.0.6, PHP 5, PHP 7)
print_r(array_map(function($a){return $a['sku'];}, $array));

// (PHP 5 >= 5.5.0, PHP 7)
print_r(array_column($array,'sku'));  

you new array will be

$new_array = array_map(function($a){return $a['sku'];}, $array);

$new_array = array_column($array,'sku');
Akshay Hegde
  • 16,536
  • 2
  • 22
  • 36
0

There are lots of array functions that could be of help, but readability suffers. Why not do this:

$simpleArray = [];
foreach ($complicatedArray as $skuArray) {
  $simpleArray[] = $skuArray['sku'];
}

Not as short as it can be, but comprehensible. It might even execute slightly faster, but the difference will be minimal.

OK, I have to admit that array_column() is a very nice solution, and most likely quite a bit faster.

KIKO Software
  • 15,283
  • 3
  • 18
  • 33