I want to sort the following data items in the order they are presented below :
$char = array('A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C');
And i want the output is :
$char = array('A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C');
Any tricks to make it sort with PHP
Many Thanks!
bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
This function sorts an array. Elements will be arranged from lowest to highest when this function has completed.
Try this:
$char = array('A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C');
sort($char);
print_r($char);
Credit: here
In order to sort an array in the Ascending order of the values you can use the asort() so that it sorts the array in ascending order of the values.
asort — Sort an array and maintain index association.
This function sorts an array such that array indices maintain their correlation with the array elements they are associated with. This is used mainly when sorting associative arrays where the actual element order is significant.
Example Code:
<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
asort($fruits);
foreach ($fruits as $key => $val) {
echo "$key = $val\n";
}
?>
Output:
c = apple
b = banana
d = lemon
a = orange
Example Reference: asort
Solution to your Question
Your Code needs to be like this.
<?php
$char = array('A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C');
asort($char);//Sorts the array here
foreach ($char as $key => $val) {
$values[] = $val;
}
print_r($values);//Print the sorted output
?>
Output:
Array ( [0] => A [1] => A [2] => A [3] => A [4] => A [5] => B [6] => B [7] => B [8] => B [9] => B [10] => C [11] => C [12] => C [13] => C [14] => C )
Related
I show my example of diff between values in arrays, sometimes doesn't work corectly.
$fields = array(
'1x1' => 'k',
'1x2' => 'B',
'1x3' => 'c',
'2x1' => 'd',
'2x2' => 'x',
'2x3' => 'Y',
'3x1' => 'b',
'3x2' => 'e',
'3x3' => 'f'
);
print_r($fields);
$answer = array(
'a',
'b',
'c',
'd',
'x',
'y',
'z',
'e',
'f'
);
print_r($answer);
echo '<hr />DIFF:<br />';
print_r(array_diff($fields, $answer));
?>
Results is:
(
[1x1] => k
[1x2] => B
[2x3] => Y
)
But should be:
(
[1x1] => k
[1x2] => B
[2x3] => Y
[3x1] => b
)
Why for PHP b is equal with z?
How to repair this?
This is working correct. According to array_diff() documentation:
array array_diff ( array $array1 , array $array2 [, array $... ] )
Compares array1 against one or more other arrays and returns the
values in array1 that are not present in any of the other arrays.
Another important info from documentation:
Two elements are considered equal if and only if (string) $elem1 ===
(string) $elem2. In words: when the string representation is the same.
So in $answers array there are no k, B, Y elements of $fields array.
The method isn't wrong, compare the 2 lists, they both contain b
see you put 'b' into both the $answer and the $fields array .
so that's why it gives u such output .
I am trying to find a way to transform a string type variable into an array type variable. To be more precise, what i am looking for is the change this (example):
$v = "['1', 'a', ['2', 'b', ['3'], 'c']]";
note that this is not a json-formatted string.
into this:
$v = ['1', 'a', ['2', 'b', ['3'], 'c']];
Note the double-quotes in the first example, $v is a string, not an array, which is the desired effect.
Simple solution using str_replace(to prepare for decoding) and json_decode functions:
$v = "['1', 'a', ['2', 'b', ['3'], 'c']]";
$converted = json_decode(str_replace("'",'"',$v));
print_r($converted);
The output:
Array
(
[0] => 1
[1] => a
[2] => Array
(
[0] => 2
[1] => b
[2] => Array
(
[0] => 3
)
[3] => c
)
)
$v = "['1', 'a', ['2', 'b', ['3'], 'c']]";
eval("\$v = $v;");
var_dump($v);
PS: make sure $v string doesn't contain unexpected code.
This should work:
$json = "['1', 'a', ['2', 'b', ['3'], 'c']]";
$json = str_replace("'",'"',$json);
$result_array = json_decode($json); // This is your array
To save on typing out the key name for every single array, I want to be able to build lists like..
$lists = array (
0 => array ('A', 'B', 'C', 'D', 'E');
1 => array ('A', 'B', 'C', 'D', 'E');
2 => array ('A', 'B', 'C', 'D', 'E');
)
.. and then assign the same key names to all them (either before or after)..
Key1, Key2, Key3, Key4, Key5
.. so when they're called, I can do something like..
foreach($lists as $list) {
showList($list);
}
.. and then within the showList() function, I can call the 5 keys by the key name.
The function I have set no problem, but it's assigning the key names that I'm not sure how to do. Sorry if my terminology isn't accurate, but hopefully I explained it well enough.
array_combine will make an associative array from an array of keys and an array of values.
$keys = array('Key1', 'Key2', 'Key3', 'Key4', 'Key5');
foreach ($lists as $list) {
showList(array_combine($keys, $list));
}
If you want to modify $lists permanently, you can do:
foreach ($lists as &$list) {
$list = array_combine($keys, $list);
}
The reference variable &$list makes this replace the elements in place.
Try this :
<?php
$keys = array('Key1', 'Key2', 'Key3', 'Key4', 'Key5');
$lists = array (
array ('A', 'B', 'C', 'D', 'E'),
array ('A', 'B', 'C', 'D', 'E'),
array ('A', 'B', 'C', 'D', 'E')
);
function showList($list){
global $keys;
return array_combine($keys, $list);
}
$output = array_map("showList", $lists);
echo "<pre>";
print_r($output);
?>
Result:
Array
(
[0] => Array
(
[Key1] => A
[Key2] => B
[Key3] => C
[Key4] => D
[Key5] => E
)
[1] => Array
(
[Key1] => A
[Key2] => B
[Key3] => C
[Key4] => D
[Key5] => E
)
[2] => Array
(
[Key1] => A
[Key2] => B
[Key3] => C
[Key4] => D
[Key5] => E
)
)
How can I merge two arrays:
$arr1 = [1 => 'a', 2 => '', 3 => 'c'];
$arr2 = [1 => 'd', 2 => 'e', 3 => 'f'];
and get:
[1 => 'a', 2 => 'e', 3 => 'c'];
I have done it succesfully with:
$arr1 = [1 => 'a', 3 => 'c'];
$arr2 = [1 => 'd', 2 => 'e', 3 => 'f'];
$arr1 + $arr2;
But, sometimes $arr1 also contains value 2 => '' which is empty but present and in this case key 2 will not be overwriten by $arr2.
Use
$arr1 = array(1 => 'a', 2 => '', 3 => 'c');
$arr2 = array(1 => 'd', 2 => 'e', 3 => 'f');
$arr3 = array_filter($arr1) + array_filter($arr2);
print_r($arr3);
$arr1 = array("a","","c");
$arr2 = array("d","e","f");
$i = 0;
foreach ($arr1 as $value) {
if($arr1[$i] == "")
$arr1[$i] = $arr2[$i];
$i++;
}
print_r($arr1);
Here matrices must be equal in dimension and the number of elements
I have two arrays and want to find the first match for either of arrayTwos values in arrayOne.
arrayOne ( [0] = C [1] = A [2] = B [3] = D [4] = B [5] = C)
and
arrayTwo ( [0] = A [1] = B [2] = C )
With these values I would want to return the value "C" as it is the first value in arrayTwo to appear in arrayOne.
I'm thinking I could use for loops and if statements to run through but re there any functions in PHP I could use to simplify this?
Use array_search
$keys = array_search($second_array, $first_array);
Ref : http://in3.php.net/array_search
array_search
$valuekeys = array_search($secondarray, $arrayone);
use array_intersect
$arrayOne = array('C', 'A', 'B', 'D', 'B', 'C');
$arrayTwo = array('A', 'C');
$result = array_intersect($arrayOne , $arrayTwo);
echo $result[0];
Use array_intersect. This will do the job. http://www.php.net/manual/en/function.array-intersect.php Note the difference between using array_intersect($array1, $array2) and array_intersect($array2, $array1)
You can use array_intersect():
$arr1 = array( 0 => 'C', 1 => 'A', 2 => 'B', 3 => 'D', 4 => 'B', 5 => 'C');
$arr2 = array( 0 => 'A', 1 => 'B', '2' => 'C' );
$arr3 = array_intersect($arr1,$arr2);
var_dump($arr3[0]);
string(1) "C"