2010-01-18 6 views
0

그래서 관련없는 이유로 자체적으로 하나의 폭파 필드가있는 배열이 있습니다. 이제 그 필드의 문자열을 폭발시키고 그 필드를 폭발의 결과로 바꾸는 데 관심이 있습니다. 나는 여기서 일하는 해결책을 가지고 있지만,보기 흉하게 보입니다. 나는 더 효율적인 것에 관심이 있습니다. 또는 적어도 미학적으로 기쁘게합니다.하나의 배열 필드 분해 및 바꾸기

예 배열 :

$items = array(
       'name' => 'shirt', 
       'kind' => 'blue|long|L', 
       'price' => 10, 
       'amount' => 5); 

그리고 목표는 'color', 'lenght', 'size' 필드로 'kind' 필드를 대체하는 것입니다.

은 지금까지 내가 가지고 :

$attribs = array('color', 'lenght', 'size'); // future indices 
$temp = explode("|", $items['kind']); // exploding the field 
foreach ($items as $key => $value) { // iterating through old array 
    if ($key == 'kind') { 
     foreach ($temp as $k => $v) { // iterating through exploded array 
      $new_items[$attribs[$k]] = $v; // assigning new array, exploded values 
     } 
    } 
    else $new_items[$key] = $value; // assigning new array, untouched values 
} 

해야 (나는 내 ​​자신의 코드에 액세스 할 수없는, 마음으로 쓰고 있어요, 나는 하나의 I를 확인할 수 없습니다 제가 예를 들어, 단지 $items 배열 unset($items['kind'])에 해당 값을 추가 할 수

$new_items = array(
       'name' => 'shirt', 
       'color' => 'blue', 
       'lenght' => 'long', 
       'size' => 'L', 
       'price' => 10, 
       'amount' => 5); 

:이 이런 식으로 뭔가를 보이는 새로운 배열) 결과를 바로 썼다 ... 그래서 오류가 있다면, 나는 사과 하지만 그건 명령을 던져 버릴거야. ut의 쾅하고, 나는 그 다음에 foreach 루프가 필요하다.

그래서 더 쉬운 방법이 있습니까?

EDIT : (회신으로 회신하기 때문에 코드가 위로 올라갑니다.) 저는 foreach 루프에서 하나를 호출하면 특정 순서로 호출합니다. 만약 내가 추가한다면, 테이블 디스플레이를 위해 필요한 순서로 엉망이됩니다. 나는 초기 데이터를 얻는 설정 방식에 의존하는 디스플레이 코드를 복잡하게해야 할 것이다. 는 현재 내가 가진 데이터 (또는 동급)을 표시 :

$items = array('name' => 'shirt', 'kind' => 'blue|long|L', 'price' => 10, 'amount' => 5); 
list($items['color'], $items['lenght'], $items['size'])=explode("|",$items['kind']); 
unset $items['kind']; 

이 시도

echo "<td>$new_items['name']</td>\n"; 
foreach ($attribs as $v) echo "<td>$new_items[$v]</td>\n"; 
echo "<td>$new_items['price']</td>\n"; 
echo "<td>$new_items['amount']</td>\n"; 

답변

0

: 난 그냥 추가하면

foreach($new_items as $v) echo "<td>$v</td>\n"; 

, 내가 뭔가를해야 할 것 나는 그것을 테스트하지는 않았지만 제대로 작동 할 것입니다.

+0

음, 작동하지만 끝까지 추가됩니다 (편집에서 설명한 것과 동일한 문제). 흥미롭게도, ...여러분의 코드로 print_r ($ items)을 할 때, 키를 이름 - 가격 - 색상 - 길이 길이로 나열하지 않습니다 (예상대로, 유령 코드의 경우처럼). 그러나 순서대로 이름 - 가격 - 비용 - 크기 - 길이 - 색상. 폭발 한 세 마리가 뒤집혔습니다. 어째서? –

1

연관 배열은 일반적으로 순서에 의존해서는 안됩니다. 배열을 직접 색인화하고 루프를 포기하기 위해 이후 코드를 수정하는 것을 고려할 것입니다.

0

연관 배열에는 순서가 없으므로 더 이상 필요하지 않은 키의 설정을 해제 한 다음 새 값을 새 키에 할당하기 만하면됩니다.

0

하나는 두 개의 숫자 순서 배열에 키와 값을 분할하고 마지막에 그들을 결합하기 때문에이 순서를 유지해야

$items = array(
       'name' => 'shirt', 
       'kind' => 'blue|long|L', 
       'price' => 10, 
       'amount' => 5); 
$attribs = array('color', 'lenght', 'size'); 
$temp = explode("|", $items['kind']); 
$s = array_combine($attribs,$temp); 
unset($items["kind"]); 
print_r(array_merge($items, $s)); 
0

방법. 더 효율적이지는 않지만 코드를 읽기가 쉽습니다.

$kind_keys = array('color', 'length', 'size'); 
$kind_values = explode("|", $items['kind']); 
$keys = array_keys($items); 
$values = array_values($items); 
$index = array_search('kind', $keys); 

// Put the new keys/values in: 
array_splice($keys, $index, 1, $kind_keys); 
array_splice($values, $index, 1, $kind_values); 

// combine the result into a new array: 
$result = array_combine($keys, $values)); 
관련 문제