我有以下陣列,我們將呼叫它,$arr并且我準備了一個示例陣列。我需要操縱路徑$arr['svg']以使特定的鍵和值始終位于索引 0 位置。這是一個示例資料集,取決于我正在使用的資料,鍵和值不是固定的,但重點是始終將標題陣列(鍵和值)放在 svg 陣列的頂部。
$arr = array("svg" =>
array(
0 => array("@style" => "overflow:visible", "@xlink:href" => "test.png"),
1 => array("g" => "", "@id" => "Layer_2"),
2 => array("g" => "", "@id" => "Layer_3"),
3 => array("title" => "test")
),
"@version" => 1.2,
"@baseProfile" => "tiny-ps",
"@id" => "Layer_1",
"@xmlns" => "http://www.w3.org/2000/svg"
);
我試圖在陣列路徑 $arr['svg'] 下實作兩件事
- 如果陣列鍵標題存在于 $arr['svg'] 并且它不在索引 0 位置,則將其移動到 $arr['svg'] 的索引 0 并將其他所有內容向下移動。
- 如果陣列鍵標題在 $arr['svg'] 中不存在,則將它的 array('title' => 'test') 添加到 $arr['svg'] 的索引 0 位置并將其他所有內容向下移動。
$arr 的預期輸出如下:
Array
(
[svg] => Array
(
[0] => Array
(
[title] => test
)
[1] => Array
(
[@style] => overflow:visible;
[@xlink:href] => test.png
)
[2] => Array
(
[g] =>
[@id] => Layer_2
)
[3] => Array
(
[g] =>
[@id] => Layer_3
)
)
[@version] => 1.2
[@baseProfile] => tiny-ps
[@id] => Layer_1
[@xmlns] => http://www.w3.org/2000/svg
)
我正在嘗試使用此函式來實作此目的,但似乎此函式僅適用于根陣列位置 $arr,而不適用于特定路徑 $arr['svg']。如果可以修改它以在希望解決問題的特定路徑內作業。
//source: https://gist.github.com/wpscholar/0deadce1bbfa4adb4e4c
function push_at_to_associative_array($array, $key, $new ){
$keys = array_keys( $array );
$index = array_search( $key, $keys, true );
$pos = false === $index ? count( $array ) : $index 1;
$array = array_slice($array, 0, $pos, true) $new array_slice($array, $pos, count($array) - 1, true);
return $array;
}
Usage:
$title = array("title" => "test');
$arr = push_at_to_associative_array($arr, 'svg', $title);
uj5u.com熱心網友回復:
將 svg 陣列處理成一個新的[0],如果我們稍后找到一個標題,則將其設定為默認標題,用找到的替換svg[0]['title'],然后最后用svg新的替換陣列的原始部分。
$arr = [
"svg" =>
[
["@style" => "overflow:visible", "@xlink:href" => "test.png"],
["g" => "", "@id" => "Layer_2"],
["g" => "", "@id" => "Layer_3"],
["title" => "Fred"]
],
"@version" => 1.2,
"@baseProfile" => "tiny-ps",
"@id" => "Layer_1",
"@xmlns" => "http://www.w3.org/2000/svg"
];
function push_at_to_associative_array(&$arr)
{
$new_svg = [];
foreach ($arr['svg'] as $key => $svg){
if ( $key == 0){
$new_svg[] = ['title'=>'test'];
}
if ( !array_key_exists('title', $svg) ){
$new_svg[] = $svg;
} else {
# amend title
$new_svg[0]['title'] = $svg['title'];
}
}
$arr['svg'] = $new_svg;
}
push_at_to_associative_array($arr);
print_r($arr);
結果
Array
(
[svg] => Array
(
[0] => Array
(
[title] => Fred
)
[1] => Array
(
[@style] => overflow:visible
[@xlink:href] => test.png
)
[2] => Array
(
[g] =>
[@id] => Layer_2
)
[3] => Array
(
[g] =>
[@id] => Layer_3
)
)
[@version] => 1.2
[@baseProfile] => tiny-ps
[@id] => Layer_1
[@xmlns] => http://www.w3.org/2000/svg
)
如果你title在陣列中沒有 a的情況下運行它
$arr = [
"svg" =>
[
["@style" => "overflow:visible", "@xlink:href" => "test.png"],
["g" => "", "@id" => "Layer_2"],
["g" => "", "@id" => "Layer_3"]
],
"@version" => 1.2,
"@baseProfile" => "tiny-ps",
"@id" => "Layer_1",
"@xmlns" => "http://www.w3.org/2000/svg"
];
function push_at_to_associative_array(&$arr)
{
$new_svg = [];
foreach ($arr['svg'] as $key => $svg){
if ( $key == 0){
$new_svg[] = ['title'=>'test'];
}
if ( !array_key_exists('title', $svg) ){
$new_svg[] = $svg;
} else {
# amend title
$new_svg[0]['title'] = $svg['title'];
}
}
$arr['svg'] = $new_svg;
}
push_at_to_associative_array($arr);
print_r($arr);
結果
Array
(
[svg] => Array
(
[0] => Array
(
[title] => test
)
[1] => Array
(
[@style] => overflow:visible
[@xlink:href] => test.png
)
[2] => Array
(
[g] =>
[@id] => Layer_2
)
[3] => Array
(
[g] =>
[@id] => Layer_3
)
)
[@version] => 1.2
[@baseProfile] => tiny-ps
[@id] => Layer_1
[@xmlns] => http://www.w3.org/2000/svg
)
uj5u.com熱心網友回復:
一個簡單的解決方案是做這樣的事情:
function fix_array( $array ) {
$svg_title_index = array_key_first(
array_filter(
$array['svg'],
fn($item) => isset($item['title'])
)
);
if (! $svg_title_index) {
array_unshift($array['svg'], ['title' => 'test']);
} elseif($svg_title_index > 0) {
$value = $array['svg'][$svg_title_index];
unset($array['svg'][$svg_title_index]);
array_unshift($array['svg'], $value);
}
return $array;
}
/* CASE 1 - SVG EXISTS BUT IS NOT FIRST */
$array = [
'svg' => [
[
'@style' => 'overflow:visible;',
'@@xlink:href' => 'test.png'
],
[
'title' => 'some existing title',
],
],
'@version' => '1.2',
'@baseProfile' => 'tiny-ps',
'@id' => 'Layer_1',
'@xmlns' => 'http://www.w3.org/2000/svg'
];
print_r(fix_array( $array ));
/* CASE 2 - SVG DOES NOT EXIST */
$array = [
'svg' => [
[
'@style' => 'overflow:visible;',
'@@xlink:href' => 'test.png'
]
],
'@version' => '1.2',
'@baseProfile' => 'tiny-ps',
'@id' => 'Layer_1',
'@xmlns' => 'http://www.w3.org/2000/svg'
];
print_r(fix_array( $array ));
你可以在這里看到它的實際效果
uj5u.com熱心網友回復:
好的,所以 OP 想要將具有title屬性的陣列移動到陣列的開頭,或者如果它不存在則插入一個測驗值。
下面的函式應該可以實作這一點。它可能不是最漂亮或最有效的,但它應該讓你走上正軌。
function order_svg_title( array $input, ?string $default_title ) {
$position = null;
// Find position of existing title (if exists).
foreach( $input[ 'svg' ] as $key => $value ) {
if ( isset( $value[ 'title' ] ) && $key !== 0 ) {
$position = $key;
}
}
// Doesn't already exist, add default title (if not null).
if ( is_null( $position ) ) {
array_unshift( $input[ 'svg' ], array( 'title' => $default_title ) );
}
// Title exists but it's in the wrong position.
else {
$value = $input[ 'svg' ][ $position ];
unset( $input[ 'svg' ][ $position ] );
array_unshift( $input[ 'svg' ], $value );
}
return $input;
}
所以對于這個例子,用法是......
$arr = array(
"svg" => array(
array(
"@style" => "overflow:visible",
"@xlink:href" => "test.png"
),
array(
array("g" => "", "@id" => "Layer_2"),
array("g" => "", "@id" => "Layer_3")
)
),
"@version" => 1.2,
"@baseProfile" => "tiny-ps",
"@id" => "Layer_1",
"@xmlns" => "http://www.w3.org/2000/svg"
);
$new_arr = order_svg_title( $arr, 'test' );
會回傳:
Array
(
[svg] => Array
(
[0] => Array
(
[title] => test
)
[1] => Array
(
[@style] => overflow:visible
[@xlink:href] => test.png
)
[2] => Array
(
[0] => Array
(
[g] =>
[@id] => Layer_2
)
[1] => Array
(
[g] =>
[@id] => Layer_3
)
)
)
[@version] => 1.2
[@baseProfile] => tiny-ps
[@id] => Layer_1
[@xmlns] => http://www.w3.org/2000/svg
)
Now with an existing title:
$arr = array(
"svg" => array(
array(
"@style" => "overflow:visible",
"@xlink:href" => "test.png"
),
array(
array("g" => "", "@id" => "Layer_2"),
array("g" => "", "@id" => "Layer_3")
),
array(
"title" => "In the wrong position. I should be moved."
)
),
"@version" => 1.2,
"@baseProfile" => "tiny-ps",
"@id" => "Layer_1",
"@xmlns" => "http://www.w3.org/2000/svg"
);
$new_arr = order_svg_title( $arr, 'test' );
Would return:
Array
(
[svg] => Array
(
[0] => Array
(
[title] => In the wrong position. I should be moved.
)
[1] => Array
(
[@style] => overflow:visible
[@xlink:href] => test.png
)
[2] => Array
(
[0] => Array
(
[g] =>
[@id] => Layer_2
)
[1] => Array
(
[g] =>
[@id] => Layer_3
)
)
)
[@version] => 1.2
[@baseProfile] => tiny-ps
[@id] => Layer_1
[@xmlns] => http://www.w3.org/2000/svg
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/329482.html
標籤:php
