我有一個物件如下,
{"metaData":[{"name":"a"},{"name":"b"}],"rows":[[1,2],[3,4],[5,6]]}
我想把它改成
[["a"=>1,"b"=>2],["a"=>4,"b"=>5],["a"=>5,"b"=>6]]
有沒有更快的班輪可以在不通過 Laravel 回圈的情況下進行轉換?
uj5u.com熱心網友回復:
您可以使用 獲取鍵array_column,然后映射array_combine行。
$keys = array_column($object->metaData, 'name');
$result = array_map(fn($row) => array_combine($keys, $row), $object->rows);
你可以把它做成這樣的單行,但它更難閱讀,它會呼叫array_column每一行而不是只呼叫一次。
$result = array_map(fn($row) => array_combine(array_column($object->metaData, 'name'), $row), $object->rows);
您需要確保每一行與元資料陣列的大小相同,否則array_combine將失敗。根據您的物件的外觀,看起來這可能總是正確的,但重要的是要注意。
uj5u.com熱心網友回復:
但。這幾乎是一個班輪:)
$str = '{"metaData":[{"name":"a"},{"name":"b"}],"rows":[[1,2],[3,4],[5,6]]}';
$obj = json_decode($str);
$obj->rows = array_map( function ($a) {return ['a'=>$a[0], 'b'=>$a[1]];} , $obj->rows);
print_r($obj);
echo json_encode($obj);
結果
stdClass Object
(
[metaData] => Array
(
[0] => stdClass Object
([name] => a)
[1] => stdClass Object
([name] => b)
)
[rows] => Array
(
[0] => Array
([a] => 1,[b] => 2)
[1] => Array
([a] => 3,[b] => 4)
[2] => Array
( [a] => 5,[b] => 6)
)
)
{"metaData":[{"name":"a"},{"name":"b"}],"rows":[{"a":1,"b":2},{"a":3,"b":4},{"a":5,"b":6}]}
UPDATE,使用名稱形成陣列索引的元資料。不再是一個班輪,但它很有趣
$str = '{"metaData":[{"name":"ali"},{"name":"bill"}],"rows":[[1,2],[3,4],[5,6]]}';
$obj = json_decode($str);
// get array of names
$names = array_map( function ($a) {return $a->name;}, $obj->metaData);
// use it in the array map to get any number of names
$rows = array_map( function ($a) use($names) {
for( $x=0; $x<count($names); $x ) {
$ret[] = [$names[$x]=>$a[$x]];
}
return $ret;
}
, $obj->rows);
$obj->rows = $rows;
print_r($obj);
echo json_encode($obj);
新結果
stdClass Object
(
[metaData] => Array
(
[0] => stdClass Object
(
[name] => ali
)
[1] => stdClass Object
(
[name] => bill
)
)
[rows] => Array
(
[0] => Array
(
[0] => Array
(
[ali] => 1
)
[1] => Array
(
[bill] => 2
)
)
[1] => Array
(
[0] => Array
(
[ali] => 3
)
[1] => Array
(
[bill] => 4
)
)
[2] => Array
(
[0] => Array
(
[ali] => 5
)
[1] => Array
(
[bill] => 6
)
)
)
)
{"metaData":[{"name":"ali"},{"name":"bill"}],"rows":[[{"ali":1},{"bill":2}],[{"ali":3},{"bill":4}],[{"ali":5},{"bill":6}]]}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/487487.html
上一篇:如何從php中的單個陣列創建具有相同元素的多個陣列?
下一篇:從物件訪問表
